在应用程序中获取所有实现接口的对象

Posted

技术标签:

【中文标题】在应用程序中获取所有实现接口的对象【英文标题】:Getting all the object implementing an interface inside an application 【发布时间】:2010-11-15 11:03:39 【问题描述】:

我需要获取应用程序中实现给定接口的所有对象。 我怎样才能做到这一点?

谢谢

为了澄清我正在寻找不是类型的实例。


再次澄清一下,我想我需要做一些邪恶的事情,比如获取与我的 AppDomain 关联的所有线程并遍历它们的堆栈。

再次-我老板的想法...我想过使用 IOC 或 AOP....

【问题讨论】:

使用反射(如您标记的那样) 可能重复:***.com/questions/26733/…, ***.com/questions/302542/… 你想要所有实现接口的类的实例,还是所有实现接口的类? 您可能在谈论面向方面的编程 你想要对象还是想要类? 【参考方案1】:

这将搜索所有加载的程序集。

AppDomain myDomain = AppDomain.CurrentDomain;
Assembly[] loadedAssemblies = MyDomain.GetAssemblies();
foreach(Assembly assembly in loadedAssemblies)

    Type[] types = assembly.GetTypes();
    foreach (Type type in types)
    
        if (type.GetInterface(interface name) != null)
            Console.WriteLine(type.Name);
    

【讨论】:

这只是查找类型,而不是实例。他需要某种 IoC 容器。话虽如此,我确实发现您的代码很有用:)【参考方案2】:

这是做不到的。

要找到一个对象,你需要一个对它的引用。如果您没有对它的引用,但想“找到”它,这是不可能的。

【讨论】:

他想找到所有对象。但是您的代码返回类列表。【参考方案3】:

一种方法是使用 MEF,它的性能可能比使用标准反射更好。

http://mef.codeplex.com/

您基本上为所有接口实现添加一个属性,然后 MEF 可以扫描您的程序集(以及您告诉它扫描的任何文件夹中的任何其他程序集)以查找实现。

【讨论】:

【参考方案4】:

因此,您希望找到实现特定接口的所有实例——不是类,而是实际对象。您需要以某种方式枚举对象的实例。我不知道有办法做到这一点。

但是,如果您可以为您拥有的所有相关对象(类似于您自己的 Object 类)创建某种共同祖先,那么您可以添加所有实例的静态枚举通过在构造函数中注册它们来创建。然后,您可以简单地运行它们并检查每个实例以查看它是否实现了接口。当然,这种方法的问题在于,这些实例永远不会被垃圾回收,即使您已经使用完它们,因为它们总是有一个指向它们的引用。

这使我得出结论,可能没有“内置”方式来枚举类或接口的实例,甚至枚举内存中的所有实例,因为拥有任何此类枚举对象意味着即使您不再引用它们,这些实例也永远不会被垃圾收集,因为它们仍然可以被“引用”。这个想法与托管代码的全部观点相矛盾...因此,除非您找到自己的方法来枚举实例,否则我认为您无法做到。

希望有所帮助:-)

【讨论】:

以上是关于在应用程序中获取所有实现接口的对象的主要内容,如果未能解决你的问题,请参考以下文章

.NET 一般处理程序中获取到的session值为空

获取所有实现给定接口的类

如何把一个接口的所有实现类反射出来?

设置和获取与执行环境相关的信息?

ApplicationContextAware 接口的作用

获取数据库连接