如何确定一个types是否实现了一个使用C#reflection的接口

C# reflection提供了一种方法来确定是否某些给定的System.Typetypes模型的某些接口?

 public interface IMyInterface {} public class MyType : IMyInterface {} // should yield 'true' typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface); 

你有几个select我的头顶

  1. typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

  2. 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())