在C#中检查generics方法的types参数
是否有可能在C#中做这样的事情:
public void DoSomething<T>(T t) { if (T is MyClass) { MyClass mc = (MyClass)t ... } else if (T is List<MyClass>) { List<MyClass> lmc = (List<MyClass>)t ... } }
是:
if (typeof(T) == typeof(MyClass)) { MyClass mc = (MyClass)(object) t; } else if (typeof(T) == typeof(List<MyClass>)) { List<MyClass> lmc = (List<MyClass>)(object) t; }
有点奇怪的是,你需要通过一个强制转换来反对,但这只是generics的工作方式 – 没有像你所期望的那样从generics转换。
当然另一种select是使用正常的执行时间检查:
MyClass mc = t as MyClass; if (mc != null) { // ... } else { List<MyClass> lmc = t as List<MyClass>; if (lmc != null) { // ... } }
当然,如果t
为空,那么它的行为将与第一个代码块不同。
尽可能地避免这种types的代码,但是有时候可能是必须的,但是generics方法的思想是能够编写通用代码,这些代码对于任何types都是相同的。
这是2017年,我们现在有C#7模式匹配。 如果你的typesTinheritanceobject
你可以像这样编码
void Main() { DoSomething(new MyClass { a = 5 }); DoSomething(new List<MyClass> { new MyClass { a = 5 }, new MyClass { a = 5 }}); } public void DoSomething(object t) { switch (t) { case MyClass c: Console.WriteLine($"class.a = {ca}"); break; case List<MyClass> l: Console.WriteLine($"list.count = {l.Count}"); break; } } class MyClass { public int a { get; set;} }
我相信你的devise有问题。 你想比较一个已经generics的方法中的types。 generics是为了处理typesvariables的情况。 我build议这样做..
//Generic Overload 1 public void DoSomething<T>(T t) where T : MyClass { ... } //Generic Overload 2 public void DoSomething<T>(T t) where T : List<MyClass> { ... }