Finding all classes that implement C# interface - Similar to Java
Possible Duplicates:
Getting all types that implement an interface with C# 3.5
How to find what class(es) implements an interface (.Net)
C语言中有可能是Java吗?
如果我有一个接口名(出于参数考虑,IDataReader),如何获得实现这个接口的所有类的列表?
在Java中,这是在API中列出的——这是C语言中可用的吗?
如果使用Resharper,可以右键单击类或方法标识符并选择"转到继承者",它将显示类或方法的所有实现的列表。
不过,在默认情况下,Visual Studio不具有此功能。如果没有Resharper,可以通过编译.dll并在Reflector中分析它们来完成。
如果您要在开发时浏览一个程序集,那么像Reflector这样的静态分析工具(如代理_所建议的)是您的最佳选择。如果您希望在运行时完成这项工作,那么反射就是解决问题的方法。无论采用哪种方法,都需要定义搜索范围:您希望查看哪些程序集?
在开发时,这可能很简单,Reflector将允许您通过将程序集加载到其查看器中轻松地指定这些程序集。在运行时,这可能更困难。为了避免贪婪地加载各种其他无用的程序集,我假设您希望浏览所有当前加载的程序集,但这可能不正确。因此,我将把它分为两个功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static IEnumerable<Type> GetImplementations(Type interfaceType) { // this will load the types for all of the currently loaded assemblies in the // current domain. return GetImplementations(interfaceType, AppDomain.CurrentDomain.GetAssemblies()); } public static IEnumerable<Type> GetImplementations(Type interfaceType, IEnumerable<Assembly> assemblies) { return assemblies.SelectMany( assembly => assembly.GetExportedTypes()).Where( t => interfaceType.IsAssignableFrom(t) ); } |
可以使用Reflector查找已加载的那些程序集的派生类型。
给定类型列表,可以使用type.isassignablefrom查找实现给定接口的类:
1 2 | IEnumerable<Type> types = Assembly.LoadFrom("assemblyPath").GetTypes(); var impls = types.Where(t => typeof(TargetInterface).IsAssignableFrom(t) && t.IsClass); |
您可以使用反射来查看特定的程序集,并循环遍历其所有类型,以确定其IDataReader等。对于大多数情况,我不一定推荐这样做,而且我不相信有内置的东西。