如何确定一个types是否实现了一个使用C#reflection的接口
在C#
reflection提供了一种方法来确定是否某些给定的System.Type
types模型的某些接口?
public interface IMyInterface {} public class MyType : IMyInterface {} // should yield 'true' typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);
你有几个select我的头顶
-
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
-
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
使用Type.IsAssignableFrom
:
typeof(IMyInterface).IsAssignableFrom(typeof(MyType));
typeof(IMyInterface).IsAssignableFrom(someclass.GetType());
要么
typeof(IMyInterface).IsAssignableFrom(typeof(MyType));
public static bool ImplementsInterface( this Type type, Type ifaceType ) { Type[] intf = type.GetInterfaces(); for ( int i = 0; i < intf.Length; i++ ) { if ( intf[ i ] == ifaceType ) { return true; } } return false; }
我认为这是正确的发布,原因有三:
1)它使用GetInterfaces而不是IsAssignableFrom,因为IsAssignableFrom在几次检查调用GetInterfaces后最终会更快。
2)它遍历本地数组,所以不会有边界检查。
3)它使用为Type定义的==运算符,因此可能比Equals方法(Contains调用将最终使用)更安全。
正如别人已经提到:本杰明4年4月10日在22:21“
确实很容易不注意,并从IsAssignableFrom反向获取参数。 我现在将使用GetInterfaces:p –
那么另外一个办法就是创build一个简短的扩展方法,在某种程度上实现“最常见”的思维方式(并且认为这是一个很小的个人select,根据自己的喜好稍微“更自然” ):
public static class TypeHelpers { public static Boolean IsAssignableTo(Type type, Type assignableType) { return assignableType.IsAssignableFrom(type); } } public static class TypeExtensions { public static Boolean IsAssignableTo(this Type type, Type assignableType) { return TypeHelpers.IsAssignableTo(type, assignableType); } }
为什么不去更通用一些(不知道是否真的有趣,我想我只是通过另一个'语法'糖):
public static class TypeHelpers { public static Boolean IsAssignableTo(Type type, Type assignableType) { return assignableType.IsAssignableFrom(type); } public static Boolean IsAssignableTo<TAssignable>(Type type) { return TypeHelpers.IsAssignableTo(type, typeof(TAssignable)); } } public static class TypeExtensions { public static Boolean IsAssignableTo(this Type type, Type assignableType) { return TypeHelpers.IsAssignableTo(type, assignableType); } public static Boolean IsAssignableTo<TAssignable>(this Type type) { return TypeHelpers.IsAssignableTo<TAssignable>(type); } }
我认为这样做可能更自然,但是再次只是个人意见的问题:
var isTrue = michelleType.IsAssignableTo<IMaBelle>();
修改Jeff的最佳性能答案(感谢Pierre Arnaud的性能testing):
var type = typeof(MyType); var implementsInterface = typeof(IMyInterface).IsAssignableFrom(type) && type.IsClass;
要find在给定的Assembly
集中实现接口的所有types:
var implementations = typeof(TypeInTargetAssembly).Assembly.GetTypes() .Where(t => typeof(IMyInterface).IsAssignableFrom(t) && t.IsClass);
我已经做了:
public static bool Implements<I>(this Type source) where I : class { return typeof(I).IsAssignableFrom(source); }
我希望我可以说where I : interface
,但interface
不是一个通用的参数约束选项。 class
尽可能接近。
用法:
if(MyType.Implements<IInitializable>()) MyCollection.Initialize();
我只是说了Implements
因为这更直观。 我总是得到IsAssignableFrom
flip- IsAssignableFrom
。
关于什么
if(MyType as IMyInterface != null)
?
关于什么
typeof(IWhatever).GetTypeInfo().IsInterface
IsAssignableFrom现在被移动到TypeInfo所以…. typeof(ISMSRequest).GetTypeInfo()。IsAssignableFrom(typeof(T).GetTypeInfo())