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

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



慕田峪9158850
浏览 685回答 3
3回答

喵喵时光机

我不相信有办法...您将要么能够遍历Heap,并检查那里的每个对象,要么遍历应用程序进程空间中每个活动线程的堆栈,检查上的每个堆栈引用变量。每个线程...另一种方法是,(我想你做不到)是拦截所有对象创建活动(使用容器方法)并保留应用程序中所有对象的列表...

慕无忌1623718

如果您需要实现特定接口的所有类型的实例(样本),则可以遍历所有类型,检查接口并在找到匹配项的情况下创建实例。这是一些伪代码,看起来非常像C#,甚至可以编译并返回您需要的伪代码。如果没有其他问题,它将为您指明正确的方向:public static IEnumerable<T> GetInstancesOfImplementingTypes<T>(){&nbsp; &nbsp; AppDomain app = AppDomain.CurrentDomain;&nbsp; &nbsp; Assembly[] ass = app.GetAssemblies();&nbsp; &nbsp; Type[] types;&nbsp; &nbsp; Type targetType = typeof(T);&nbsp; &nbsp; foreach (Assembly a in ass)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; types = a.GetTypes();&nbsp; &nbsp; &nbsp; &nbsp; foreach (Type t in types)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (t.IsInterface) continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (t.IsAbstract) continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (Type iface in t.GetInterfaces())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!iface.Equals(targetType)) continue;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield return (T) Activator.CreateInstance(t);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}现在,如果您正在谈论遍历堆并返回实现特定类型的所有对象的先前实例化的实例,那么祝您好运,因为此信息不是由.Net运行时存储的(可以由调试器/分析器通过检查堆来计算) / stack这样)。根据您认为需要这样做的原因,可能有更好的解决方法。

繁星点点滴滴

对象的所有实例还是所有类型?获取对象的所有实例几乎是不可能的,并且将涉及有关通过管理内存进行扫描的非公开信息。在给定的域内,获取实现给定接口的所有类型都是可行的。(即,您可以找到在程序集中定义的实现特定接口的所有类型)加载程序集遍历其类型(调用asm.GetTypes())检查typeof(IMyInterface).IsAssignibleFrom(testType)
打开App,查看更多内容
随时随地看视频慕课网APP