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

时间:2010-11-15 11:03:40

标签: c# .net reflection appdomain

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

谢谢

澄清我正在寻找不适用于类型的实例。


再次澄清一下,我觉得我需要做一些邪恶的事情,就像获取与我的AppDomain相关的所有线程并走出他们的堆栈。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

无法做到这一点。

要查找对象,您需要对它进行引用。如果你没有引用它,但想要“找到”它,那就不可能了。

答案 2 :(得分:1)

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

http://mef.codeplex.com/

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

答案 3 :(得分:0)

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

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

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

希望有所帮助: - )