.NET – 获取通用接口的所有实现?

关于“ 通过reflection实现接口 ”的答案显示了如何获得接口的所有实现。 但是,给定通用接口IInterface ,以下不起作用:

 var types = TypesImplementingInterface(typeof(IInterface)) 

任何人都可以解释我如何修改该方法?

你可以使用这样的东西:

 public static bool DoesTypeSupportInterface(Type type, Type inter) { if(inter.IsAssignableFrom(type)) return true; if(type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == inter)) return true; return false; } public static IEnumerable TypesImplementingInterface(Type desiredType) { return AppDomain .CurrentDomain .GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) .Where(type => DoesTypeSupportInterface(type, desiredType)); } 

它可以抛出TypeLoadException但这是原始代码中已经存在的问题。 例如在LINQPad中,它不起作用,因为某些库无法加载。

它不起作用,因为IInterface (使用System.Object for T作为示例)不从“open”generics类型IInterface<>inheritance。 “封闭”generics类型是根类型,就像IFoo一样。 您只能搜索封闭的generics类型,而不是打开的类型,这意味着您可以找到inheritance自IInterfaceIFoo没有基类,也没有IInterfaceIInterface等。