关于查找实现C#接口的所有类:查找实现C#接口的所有类 – 与Java类似


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等。对于大多数情况,我不一定推荐这样做,而且我不相信有内置的东西。