我知道您可以调用为每个对象执行的实例方法。我也知道您可以在可从类型调用的类型上使用静态方法。
但是如何调用作用于特定类型的每个实例的方法(例如,将成员变量设置为零)?
最佳答案
C# 不提供直接机制来跟踪所有可达对象,而且几乎没有充分的理由需要这种自动跟踪功能(而不是,比方说,您自己管理的显式池) .
但要直接回答您的要求,您需要:
- 手动跟踪该类型的所有可达实例(可能使用一组弱引用来防止跟踪器本身延长对象的生命周期)。
- 提供一种机制(比如)对该集合的每个成员执行副作用。
- 当一个对象被销毁时,从集合中移除关联的弱引用。这是防止弱引用泄漏所必需的。
所有这些都必须以线程安全的方式完成。
public class Foo
{
private static readonly HashSet<WeakReference> _trackedFoos = new HashSet<WeakReference>();
private static readonly object _foosLocker = new object();
private readonly WeakReference _weakReferenceToThis;
public static void DoForAllFoos(Action<Foo> action)
{
if (action == null)
throw new ArgumentNullException("action");
lock (_foosLocker)
{
foreach (var foo in _trackedFoos.Select(w => w.Target).OfType<Foo>())
action(foo);
}
}
public Foo()
{
_weakReferenceToThis = new WeakReference(this);
lock (_foosLocker)
{
_trackedFoos.Add(_weakReferenceToThis);
}
}
~Foo()
{
lock (_foosLocker)
{
_trackedFoos.Remove(_weakReferenceToThis);
}
}
}
你确定你需要所有这些吗?这一切都非常奇怪且不确定(会受到垃圾收集发生的时间的严重影响)。
关于c# - 在 C# 中调用类型的每个实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8612284/