查找实现C#接口的所有类 - 与Java类似

时间:2009-11-18 17:38:55

标签: c#

  

可能重复:
  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#中可用

5 个答案:

答案 0 :(得分:5)

如果您使用ReSharper,则可以右键单击类或方法标识符,然后选择“转到继承者”,它将显示该类的所有实现的列表或方法

默认情况下,Visual Studio没有此功能。如果您没有ReSharper,可以通过编译.dll并在Reflector中分析它们来实现。

答案 1 :(得分:4)

您可以使用Reflector查找已加载的程序集的派生类型。

答案 2 :(得分:4)

如果您正在谈论在开发时浏览程序集,那么像Reflector(如Agent_9191建议)这样的静态分析工具是您最好的选择。如果您希望在运行时执行此操作,那么反射就是最佳选择。无论哪种方式,您都需要定义搜索范围:您想要查看哪些程序集?

在开发时,这可能很容易,而Reflector可以让您通过将程序集加载到其查看器中来轻松指定这些内容。在运行时,这可能更困难。为了避免贪婪地加载各种其他无用的程序集,我假设您要浏览所有当前加载的程序集,但这可能不正确。出于这个原因,我将把它分解为两个函数:

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)
        );
}

答案 3 :(得分:1)

给定类型列表,您可以使用Type.IsAssignableFrom查找实现给定接口的类:

IEnumerable<Type> types = Assembly.LoadFrom("assemblyPath").GetTypes();
var impls = types.Where(t => typeof(TargetInterface).IsAssignableFrom(t) && t.IsClass);

答案 4 :(得分:0)

您可以使用反射来查看特定的程序集并遍历其所有类型,以确定它的IDataReader等。我不一定会在大多数情况下推荐这个,我不相信内置任何内容。< / p>