.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自IInterface
。 IFoo
没有基类,也没有IInterface
或IInterface
等。