查找所有实现 C# 接口的类 - 类似于 Java [重复]

Posted

技术标签:

【中文标题】查找所有实现 C# 接口的类 - 类似于 Java [重复]【英文标题】:Finding all classes that implement C# interface - Similar to Java [duplicate] 【发布时间】:2010-12-17 23:36:29 【问题描述】:

可能的重复:Getting all types that implement an interface with C# 3.5How to find what class(es) implements an interface (.Net)

这在 C# 中是否可能像在 Java 中一样?

如果我有一个接口名称(IDataReader 用于参数),我如何获得实现它的所有类的列表?

在 java 中,这在 API 中列出 - 这在 C# 中是否可用

【问题讨论】:

【参考方案1】:

如果您使用ReSharper,您可以右键单击类或方法标识符并选择“Go to Inheritor”,它将显示该类或方法的所有实现的列表。

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

【讨论】:

这是正确的答案谢谢但是给定一个类(DbDataReader)我如何找到它实现的所有接口?? 在Reflector中看一下,它显示了一个类实现的所有接口。 反射器是如何做到这一点的?【参考方案2】:

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

【讨论】:

有关您如何使用反射器执行此操作的任何详细信息?【参考方案3】:

如果您谈论的是在开发时浏览程序集,那么像 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)
        );

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

您可以使用反射来查看特定程序集并遍历其所有类型,以确定其是否为 IDataReader 等。在大多数情况下,我不一定会推荐此方法,而且我不相信内置任何东西。

【讨论】:

以上是关于查找所有实现 C# 接口的类 - 类似于 Java [重复]的主要内容,如果未能解决你的问题,请参考以下文章

转载:C#之接口简介

C# 中类似Java Map功能的语句是啥

C#为啥接口可以实例化一个实现该接口的类?

Java中关于接口的总结

C# 接口(Interface)

java接口中的方法为啥不是static就报错?