为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕田峪9158850 2019-12-04 12:48:48
我们需要获取实现给定接口的对象的所有实例-我们可以这样做,如果可以的话如何?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

我不相信有办法...您将要么能够遍历Heap,并检查那里的每个对象,要么遍历应用程序进程空间中每个活动线程的堆栈,检查上的每个堆栈引用变量。每个线程...

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


查看完整回答
反对 回复 2019-12-04
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

如果您需要实现特定接口的所有类型的实例(样本),则可以遍历所有类型,检查接口并在找到匹配项的情况下创建实例。


这是一些伪代码,看起来非常像C#,甚至可以编译并返回您需要的伪代码。如果没有其他问题,它将为您指明正确的方向:


public static IEnumerable<T> GetInstancesOfImplementingTypes<T>()

{

    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运行时存储的(可以由调试器/分析器通过检查堆来计算) / stack这样)。


根据您认为需要这样做的原因,可能有更好的解决方法。


查看完整回答
反对 回复 2019-12-04
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

对象的所有实例还是所有类型?

获取对象的所有实例几乎是不可能的,并且将涉及有关通过管理内存进行扫描的非公开信息。

在给定的域内,获取实现给定接口的所有类型都是可行的。(即,您可以找到在程序集中定义的实现特定接口的所有类型)

  • 加载程序集

  • 遍历其类型(调用asm.GetTypes())

  • 检查typeof(IMyInterface).IsAssignibleFrom(testType)


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 680 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信