检查“T”是inheritance还是实现一个类/接口
有没有一种方法来testingT是否inheritance/实现一个类/接口?
private void MyGenericClass<T> () { if(T ... inherits or implements some class/interface }
有一个名为Type.IsAssignableFrom()的方法。
要检查T
inheritance/实现Employee
:
typeof(Employee).IsAssignableFrom(typeof(T));
如果您的目标是.NET Core,则该方法已移至TypeInfo:
typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
正确的语法是
typeof(Employee).IsAssignableFrom(typeof(T))
文档:
从文档 :
返回值:如果
c
和当前的Type
表示相同的types,或者当前的Type
在c
的inheritance层次结构中,或者当前的Type
是c
实现的interface
,或者c
是genericstypes参数,当前Type
表示c
的约束之一,或者如果c
表示一个值types,并且当前的Type
表示Visual Basic中的Nullable(Of c)
为Nullable<c>
(Nullable(Of c)
)。 如果这些条件都不true
,或者c
为null
,则返回null
。
说明:
如果Employee IsAssignableFrom T
然后T
inheritanceEmployee
。
用法
typeof(T).IsAssignableFrom(typeof(Employee))
只有在任何一个时才返回true
-
T
和Employee
表示相同的types; 要么, -
Employee
从T
inheritance。
在某些情况下,这可能是有用的,但对于原始问题(以及更常见的用法),要确定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,因此HorizontalRun
和Dump
)
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)
也可以完成这个工作。