154

假设我这样做会很方便:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

其中 GetColumns 方法将根据传递的类型在内部调用不同的方法。

是的,我可以将它作为一个布尔标志或类似的,我只是想知道是否有办法通过这个,然后问:

typeof(arg[1]) 或类似...

我也可以覆盖该方法,使用泛型等 - 我知道有不同的方法可以做到这一点,我只是好奇这是否可能。

4

7 回答 7

249

有两种常见的方法。首先,你可以通过System.Type

object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:

    if (type == typeof(int)) { // ...

这将被称为:int val = (int)GetColumnValue(columnName, typeof(int));

另一种选择是使用泛型:

T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...

这具有避免装箱并提供某种类型安全性的优点,并且将被称为: int val = GetColumnValue<int>(columnName);

于 2012-06-08T20:22:43.360 回答
24

foo.GetColumnValues(dm.mainColumn, typeof(string))

或者,您可以使用通用方法:

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}

然后你可以像这样使用它:

foo.GetColumnValues<string>(dm.mainColumn);
于 2012-06-08T20:22:21.833 回答
16

您可以将类型作为参数传递,但要这样做,您必须使用typeof

foo.GetColumnValues(dm.mainColumn, typeof(int))

该方法需要接受 type 的参数Type


其中 GetColumns 方法将根据传递的类型在内部调用不同的方法。

如果你想要这种行为,那么你不应该将类型作为参数传递,而是使用类型参数。

foo.GetColumnValues<int>(dm.mainColumn)
于 2012-06-08T20:22:22.383 回答
8
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

或使用泛型:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);
于 2012-06-08T20:23:10.607 回答
1

您可以这样做,只需将其包裹在typeof()

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}
于 2012-06-08T20:22:31.297 回答
0

您可以使用类型类型的参数 - iow,传递 typeof(int)。您还可以将泛型用于(可能更有效)的方法。

于 2012-06-08T20:22:38.320 回答
0

使用泛型类型!

  class DataExtraction<T>
{
    DateRangeReport dateRange;
    List<Predicate> predicates;
    List<string> cids;

    public DataExtraction( DateRangeReport dateRange,
                           List<Predicate> predicates,
                           List<string> cids)            

    {
        this.dateRange = dateRange;
        this.predicates = predicates;
        this.cids = cids;
    }
}

并这样称呼它:

  DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
于 2019-07-31T11:25:57.360 回答