在运行时枚举类型的所有实例?

时间:2014-01-08 05:34:53

标签: c# reflection enumerate

解决。

我想知道是否有人知道在运行时是否可以获取特定类型的所有实例化类型?

让我们说我想枚举Foo类型的所有实例化对象。

public class Foo {}

var foo1 = new Foo();
Foo foo2 = new Foo();

IEnumerable<Foo> foos = GetObjects<Foo>(); 
//foos should contain foo1 and foo2

如果没有这样做的直接方式,那么我可以创建一个基础类型,在构造上订阅自己的静态服务,然后以那种方式查找...但我觉得必须已经实现这样的GC才能工作。


如果可以的话,我会给大多数人正确的答案,但是因为我无法将它交给第一个回答的人。

3 个答案:

答案 0 :(得分:5)

我担心框架内没有这样的东西。

您必须自己跟踪构造的实例,例如:使用内部列表。

public class Foo
{
    private static List<Foo> _instances = new List<Foo>();

    public Foo()
    {
        _instances.Add(this);
    }

    public static IEnumerable<Foo> Instances { get { return _instances; } }
}

当没有保留其他参考时,您可以使用WeakReference来允许GC收集这些实例。

public class Foo
{
    private static List<WeakReference<Foo>> _instances = new List<WeakReference<Foo>>();
    public Foo()
    {
        _instances.Add(new WeakReference<Foo>(this));
    }

    public static IEnumerable<Foo> Instances
    {
        get
        {
            foreach(var r in _instances)
            {
                Foo instance;
                if (r.TryGetTarget(out instance))
                    yield return instance;
            }
        }
    }
}

答案 1 :(得分:4)

在MSDN论坛上回答:http://social.msdn.microsoft.com/Forums/vstudio/en-US/f9e984e3-a47b-42b0-b9bd-1f1c55e4de96/getting-all-running-instances-of-a-specific-class-type-using-reflection?forum=netfxbcl

不可能:(

虽然他们至少会让你知道如何创建一个静态列表来保存你在创建时添加的所有类型的引用(提供你的课程类型)。

答案 2 :(得分:3)

在这种情况下,如果内存消耗没有问题,您还可以使用相同类实例的本地静态集合。这样在构造函数中,您可以将每个新实例添加到此集合中。

然后,如果您想知道所有实例,可以从下面的本地静态集合中获取它......

class Foo
{
   public static List<Foo> Instances = new List<Foo>();
   public Foo()
   {
     Instances.Add(this);
   }
  //can be accessed like below
   Foo.Instances
 }

这可能有助于解决您的问题。