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

本文关键字:列表 对象 实例化 反射 | 更新日期: 2023-09-27 18:18:16

假设您有一个Shape类。假设Shape已经被实例化为圆形、正方形和三角形。是否有一种方法在运行时获得形状对象的名称列表,然后迭代这些对象?

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

无法使用反射来获取实例化对象列表。反射可以提供关于类型的信息,或者与你引用的对象交互,但它不能让你找到"所有创建过的这种类型的对象"。

您可以使用调试api来完成此操作。例如,在WinDbg + SOS:

    !DumpHeap -type System.String -min 20000 

我不建议这样做,但是跟踪您的形状的所有实例的一种方法是:

public abstract class Shape
{
    private static readonly List<WeakReference<Shape>> allShapes = new List<WeakReference<Shape>>();
    protected Shape()
    {
        allShapes.Add(new WeakReference<Shape>(this));
    }
}

如果你需要这样做,你可能解决问题的方法是错误的。

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