在C#中仅将类型作为参数传递


128

假设地,我这样做很方便:

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

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

是的,我可以将其作为布尔标志或类似的标志来实现,我只是想知道是否有一种方法可以通过此方法,然后问:

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

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


我的想法完全取决于foo实际上是什么。 foo.GetColumnValues<int>(dm.mainColumn)可能是要走的路。
Major Productions

1
正如我所说,我意识到还有其他方法可以做到这一点(布尔标志,泛型,重写方法),我只是想知道是否有可能将其作为参数。
Mark Mayo

@MarkMayo:如果您“知道您还可以重写该方法,使用泛型等,并且您知道有不同的方法可以执行此操作,那么您只是想知道这是否可行”,我不明白这个问题。所以您知道所有这一切,但您是否有可能?
Tim Schmelter 2012年

@TimSchmelter-以我描述的形式。即将其作为第二个参数传递。事实证明,里德(Reed)有点说过我的意思-在哪里使用(...,键入类型)。那就是我想要的。
Mark Mayo

1
很好的问题,被提议,我看到MS使用Type作为VB.NET中内置运算符(例如trycast)的参数,并且经常希望我能以您所描述的方式在C#/ VB中自己做。
Chalky

Answers:


213

有两种常见的方法。首先,你可以通过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);


1
您还可以执行一个扩展方法,即公共静态T GetColumnValue <T>(此字符串columnName){...},然后可以说foo.GetColumnValues <string>(dm.mainColumn)
Joshua G

但是,如何定义一个具有多个参数的方法,其中一个参数应该是通用的?由于泛型是在方法参数列表之前定义的,那么您如何知道哪个应该是泛型呢?
BadmintonCat

5
@BadmintonCat T Foo<T,U>(string arg1, U arg2)或类似产品
Reed Copsey

使用第一种方法时,是否可以为类型分配默认值?(例如,像object GetColumnValue(string columnName, Type type = object)吗?这并不完全似乎为我工作,但它是有用的了解。
戴夫·科尔

21

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

另外,您可以使用通用方法:

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

然后可以像这样使用它:

foo.GetColumnValues<string>(dm.mainColumn);

13

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

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

该方法将需要接受类型为的参数Type


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

如果想要这种行为,则不应将类型作为参数传递,而应使用类型参数。

foo.GetColumnValues<int>(dm.mainColumn)

8
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

或使用泛型:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);

3
我没有为您提供
DVD

3
当人们需要汤匙喂养时,我讨厌它。答案+对MSDN的简短阅读就足够了。我怀疑选民是答辩人竞争的代表-多么小气。
Danny Varod 2012年

1

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

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}

0

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


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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.