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

Posted

技术标签:

【中文标题】在 C# 中仅将类型作为参数传递【英文标题】:Passing just a type as a parameter in C# 【发布时间】:2012-06-12 21:51:01 【问题描述】:

假设我这样做会很方便:

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

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

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

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

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

【问题讨论】:

我的想法完全正确,这取决于 foo 实际上是什么。 foo.GetColumnValues<int>(dm.mainColumn) 可能是要走的路。 正如我所说,我意识到还有其他方法可以做到这一点(布尔标志、泛型、覆盖方法)我只是想知道它是否可以作为参数。 @MarkMayo:我不明白这个问题,如果你 “知道你也可以重写方法、使用泛型等,而且你知道有不同的方法可以做到这一点,你只是好奇这是否可能”。所以你知道这一切,但你很好奇这是否可能?? @TimSchmelter - 以我描述的形式。即将它作为第二个参数传递。事实证明,Reed 有点说出了我所追求的 - 你在哪里使用(...,类型类型)。这就是我一直在寻找的。​​span> 好问题,赞成,我看到 MS 使用 Type 作为 VB.NET 中内置运算符的参数,例如trycast,并且经常希望我可以自己在 C#/VB 中做到这一点——按照你描述的方式。 【参考方案1】:

有两种常见的方法。首先可以通过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&lt;int&gt;(columnName);

【讨论】:

你也可以做一个扩展方法,public static T GetColumnValue(this string columnName)... 然后你可以说foo.GetColumnValues(dm.mainColumn)跨度> 但是你如何定义一个有多个参数并且其中一个应该是泛型的方法呢?既然泛型是在方法参数列表之前定义的,那你怎么知道哪一个应该是泛型呢? @BadmintonCat T Foo&lt;T,U&gt;(string arg1, U arg2) 或类似 当使用第一种方法时,有没有办法为 type 分配一个默认值? (例如 object GetColumnValue(string columnName, Type type = object) 之类的东西?这对我来说似乎不太管用,但知道会很有用。 typeof() 是一个函数,它接受 int 或 char 之类的类型或某些类名。例如类型 c = typeof(char); .Net 没有为我们提供同样的特权。上面提到的 GetColumnValue 似乎是最好的。【参考方案2】:

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

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

public void GetColumnValues<T>(object mainColumn)

    GetColumnValues(mainColumn, typeof(T));

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

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

【讨论】:

【参考方案3】:

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

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

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


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

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

foo.GetColumnValues<int>(dm.mainColumn)

【讨论】:

【参考方案4】:
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

或者使用泛型:

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

【讨论】:

我没有告诉你,但可能是因为你展示了如何调用它并且没有指定函数定义 我讨厌人们需要用勺子喂食。答案 + MSDN 的简短阅读就足够了。我怀疑那些反对的人是竞争代表的回答者——多么小气。【参考方案5】:

你可以这样做,只需将它包裹在typeof()

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)

    //logic

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

使用泛型类型!

  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);

【讨论】:

以上是关于在 C# 中仅将类型作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

仅将一些参数作为 R 中的命名列表传递给函数

C#中的枚举类型如何传递参数呢?

C#:将枚举类型作为参数传递

仅将 ArrayList 作为值而不是引用传递

C#中数组作为参数传递的问题

C#在方法调用中,参数按值传递与按引用传递的区别是啥?