如何获得实现给定接口的所有加载types的所有实例?
我们需要获得实现给定接口的所有对象的实例 – 我们可以这样做吗?如果是这样的话?
我不相信有一种方法…你必须能够走堆,并检查每个对象,或者在应用程序进程空间中遍历每个活动线程的堆栈,检查每个堆栈引用variables每个线程…
另一种方式,(我猜你不能这样做)拦截所有的对象创build活动(使用容器方法),并保持应用程序中的所有对象的列表…
如果您需要实现特定接口的所有types的实例(样本),则可以遍历所有types,如果匹配发现,则检查接口并创build实例。
这里有一些看起来非常像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; } } } }
现在,如果你正在谈论走堆,并返回实现特定types的所有对象的先前实例化的实例,那么运气好,因为这个信息不是由.Net运行时存储的(可以由debugers / profilers通过检查堆来计算/堆栈所以)。
根据你认为你需要这样做的原因,可能有更好的方法去做。
一个对象或所有types的所有实例?
获取对象的所有实例几乎是不可能的,并且会涉及有关通过pipe理内存扫描的非公开信息。
获取实现给定接口的所有types是可行的 – 在给定的域内。 (也就是说,你可以find在实现特定接口的程序集中定义的所有types)
- 加载组件
- 遍历它的types(调用asm.GetTypes())
- 检查typeof(IMyInterface).IsAssignibleFrom(testType)
如果实现指定接口的类是你的,那么你可以在实例化时实现一个弱引用列表。
IEnumerable<Type> GetAllTypesThatImplementInterface<T>() { var @interface = typeof (T); return @interface.IsInterface ? AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) .Where(type => !type.IsInterface && !type.IsAbstract && type.GetInterfaces().Contains(@interface)) : new Type[] {}; }