在 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<int>(columnName);
【讨论】:
你也可以做一个扩展方法,public static T GetColumnValueT Foo<T,U>(string arg1, U arg2)
或类似
当使用第一种方法时,有没有办法为 type 分配一个默认值? (例如 object GetColumnValue(string columnName, Type type = object)
之类的东西?这对我来说似乎不太管用,但知道会很有用。
typeof() 是一个函数,它接受 int 或 char 之类的类型或某些类名。例如类型 c = typeof(char); .Net 没有为我们提供同样的特权。上面提到的 GetColumnValuefoo.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# 中仅将类型作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章