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

Sim*_*mon 17 c# reflection

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

小智 17

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

这里有一些看起来非常像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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cha*_*ana 8

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

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