反射可以获得实例化对象的列表吗?

时间:2014-08-15 19:04:39

标签: c# reflection

假设你有一个类Shape。假设Shape已被实例化为Circle,Square和Triangle。有没有办法在运行时获取Shape对象的名称列表,然后迭代这些对象?

2 个答案:

答案 0 :(得分:5)

无法使用反射来获取实例化对象的列表。反射可以提供有关类型的信息或与您引用的对象进行交互,它不会让您找到"此类型的所有对象都已创建"。

您可以使用dubugging API来执行此操作。即在WinDbg + SOS中:

    !DumpHeap -type System.String -min 20000 

答案 1 :(得分:2)

我不建议这样做,但跟踪形状的所有实例的一种方法是执行以下操作:

public abstract class Shape
{
    private static readonly List<WeakReference<Shape>> allShapes = new List<WeakReference<Shape>>();

    protected Shape()
    {
        allShapes.Add(new WeakReference<Shape>(this));
    }
}

如果您需要这样做,您可能正在解决问题the wrong way

感谢Vyrx提出解决垃圾收集问题的WeakReference建议。