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

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

【问题讨论】:

    标签: 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 等。在大多数情况下,我不一定会推荐此方法,而且我不相信内置任何东西。

        【讨论】:

          猜你喜欢
          • 2010-09-30
          • 2012-04-16
          • 2014-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多