当前位置:  开发笔记 > 编程语言 > 正文

如何获取实现给定接口的所有已加载类型的所有实例?

如何解决《如何获取实现给定接口的所有已加载类型的所有实例?》经验,为你挑选了2个好方法。

我们需要获得实现给定接口的所有对象实例 - 我们可以这样做,如果是这样的话,怎么做?



1> 小智..:

如果您需要实现特定接口的所有类型的实例(示例),您可以浏览所有类型,检查接口并在找到匹配时创建实例.

这里有一些看起来非常像C#的伪代码,甚至可以编译并返回你需要的东西.如果没有别的,它会指出你正确的方向:

public static IEnumerable GetInstancesOfImplementingTypes()
{
    AppDomain app = AppDomain.CurrentDomain;
    Assembly[] ass = app.GetAssemblies();
    Type[] types;
    Type targetType = typeof(T);

    foreach (Assembly a in ass)
    {
        types = a.GetTypes();
        foreach (Type t in types)
        {
            if (t.IsInterface) continue;
            if (t.IsAbstract) continue;
            foreach (Type iface in t.GetInterfaces())
            {
                if (!iface.Equals(targetType)) continue;
                yield return (T) Activator.CreateInstance(t);
                break;
            }
        }
    }
}

现在,如果你在谈论走堆并返回实现特定的类型,在运气好,因为这种信息不被.NET运行时存储的所有对象的前面实例化的实例(可通过debugers /分析器通过检查堆计算/ stack so).

根据您认为您需要这样做的原因,可能有更好的方法来实现它.


是的,我想获取以前实例化的实例。这是因为我们加载了使用实现相同接口的对象来存储其设置的模块,但是似乎没有其他方法可以获取设置实例。
这是枚举引用的程序集中定义的所有类型,而不是这些类型的所有实例.

2> Charles Bret..:

我不相信有一种方法......您必须要么能够遍历堆,并检查那里的每个对象,或者在应用程序进程空间中遍历每个活动线程的堆栈,检查每个堆栈引用变量每个线程......

另一种方式,(我猜你做不到)拦截所有对象创建活动(使用容器方法)并保留应用程序中所有对象的列表...

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有