检查“T”是inheritance还是实现一个类/接口

有没有一种方法来testingT是否inheritance/实现一个类/接口?

private void MyGenericClass<T> () { if(T ... inherits or implements some class/interface } 

有一个名为Type.IsAssignableFrom()的方法。

要检查Tinheritance/实现Employee

 typeof(Employee).IsAssignableFrom(typeof(T)); 

如果您的目标是.NET Core,则该方法已移至TypeInfo:

 typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).Ge‌​tTypeInfo()) 

你可以在类上使用约束。

 MyClass<T> where T : Employee 

看看http://msdn.microsoft.com/en-us/library/d5x73970.aspx

正确的语法是

 typeof(Employee).IsAssignableFrom(typeof(T)) 

文档:

从文档 :

返回值:如果c和当前的Type表示相同的types,或者当前的Typec的inheritance层次结构中,或者当前的Typec实现的interface ,或者c是genericstypes参数,当前Type表示c的约束之一,或者如果c表示一个值types,并且当前的Type表示Visual Basic中的Nullable(Of c)Nullable<c>Nullable(Of c) )。 如果这些条件都不true ,或者cnull ,则返回null

说明:

如果Employee IsAssignableFrom T然后TinheritanceEmployee

用法

 typeof(T).IsAssignableFrom(typeof(Employee)) 

只有在任何一个时才返回true

  1. TEmployee表示相同的types; 要么,
  2. EmployeeTinheritance。

某些情况下,这可能是有用的,但对于原始问题(以及更常见的用法),要确定T何时inheritance或实现某个class / interface ,请使用:

 typeof(Employee).IsAssignableFrom(typeof(T)) 

提供的答案实际上是检查T是否实现某个类/接口的方法,但是如果您正在执行检查以防止调用方法(如果T 实现所需的接口/类),则可以使用以下约束

 public void MyRestrictedMethod<T>() where T : MyInterface1, MyInterface2, MySuperClass { //Code of my method here, clean without any check for type constraints. } 

我希望有帮助。

每个人的真正意思是:

 typeof(BaseType).IsAssignableFrom(typeof(DerivedType)) // => true 

因为您可以从DerivedType的实例字面上指派给 BaseType的实例:

 DerivedType childInstance = new DerivedType(); BaseType parentInstance = childInstance; // okay, assigning base from derived childInstance = (DerivedType) parentInstance; // not okay, assigning derived from base 

什么时候

 public class BaseType {} public class DerivedType : BaseType {} 

还有一些具体的例子,如果你有麻烦缠绕它:

(通过LinqPad,因此HorizontalRunDump

 void Main() { // http://stackoverflow.com/questions/10718364/check-if-t-inherits-or-implements-a-class-interface var b1 = new BaseClass1(); var c1 = new ChildClass1(); var c2 = new ChildClass2(); var nb = new nobase(); Util.HorizontalRun( "baseclass->baseclass,child1->baseclass,baseclass->child1,child2->baseclass,baseclass->child2,nobase->baseclass,baseclass->nobase", b1.IsAssignableFrom(typeof(BaseClass1)), c1.IsAssignableFrom(typeof(BaseClass1)), b1.IsAssignableFrom(typeof(ChildClass1)), c2.IsAssignableFrom(typeof(BaseClass1)), b1.IsAssignableFrom(typeof(ChildClass2)), nb.IsAssignableFrom(typeof(BaseClass1)), b1.IsAssignableFrom(typeof(nobase)) ).Dump("Results"); var results = new List<string>(); string test; test = "c1 = b1"; try { c1 = (ChildClass1) b1; results.Add(test); } catch { results.Add("FAIL: " + test); } test = "b1 = c1"; try { b1 = c1; results.Add(test); } catch { results.Add("FAIL: " + test); } test = "c2 = b1"; try { c2 = (ChildClass2) b1; results.Add(test); } catch { results.Add("FAIL: " + test); } test = "b1 = c2"; try { b1 = c2; results.Add(test); } catch { results.Add("FAIL: " + test); } results.Dump(); } // Define other methods and classes here public static class exts { public static bool IsAssignableFrom<T>(this T entity, Type baseType) { return typeof(T).IsAssignableFrom(baseType); } } class BaseClass1 { public int id; } class ChildClass1 : BaseClass1 { public string name; } class ChildClass2 : ChildClass1 { public string descr; } class nobase { public int id; public string name; public string descr; } 

结果

baseclass->基类

真正

child1->基类

baseclass-> child1

真正

child2->基类

baseclass->的child2

真正

nobase->基类

baseclass-> nobase将

  • FAIL:c1 = b1
  • b1 = c1
  • FAIL:c2 = b1
  • b1 = c2

我相信语法是: typeof(Employee).IsAssignableFrom(typeof(T));

虽然IsAssignableFrom是别人所说的最好的方法,但是如果你只需要检查一个类是否从另一个类inheritance, typeof(T).BaseType == typeof(SomeClass)也可以完成这个工作。