代码之家  ›  专栏  ›  技术社区  ›  AK_

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

  •  2
  • AK_  · 技术社区  · 14 年前

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

    谢谢你

    为了澄清这一点,我正在寻找不适合类型的实例。


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

    再说一遍-我老板的主意。。。我想用IOC或AOP。。。。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Pieter van Ginkel    14 年前

    这是做不到的。

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

        2
  •  3
  •   Itay Karo    14 年前

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

    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);
        }
    }
    
        3
  •  1
  •   BenCr    14 年前

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

    http://mef.codeplex.com/

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

        4
  •  0
  •   Kobi Hari    14 年前

    因此,您希望找到实现特定接口的所有实例,而不是类和实际对象。您需要以某种方式枚举对象的多个实例。我不知道怎么做。

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

    这导致我得出结论,可能没有“内置”方法来枚举类或接口的多个实例,甚至无法枚举内存中的所有实例,因为拥有任何这样的枚举对象意味着,即使不再引用这些实例,也永远无法对其进行垃圾收集,因为它们仍然可以被“引用”。这个想法影响了托管代码中的整个要点。。。所以除非你找到自己的方法来列举这些例子,否则我认为你是做不到的。

    希望有帮助:-)

    推荐文章