在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> { ... }