在c#中的每个类型实例上调用方法

Rob*_*vey 3 c# methods types instance

我知道你可以调用为每个对象执行的实例方法.我也知道你可以在类型可调用的类型上使用静态方法.

但是,如何调用一个作用于特定类型的每个实例的方法(例如,将成员变量设置为零)?

Ani*_*Ani 6

C#没有提供跟踪所有可到达对象的直接机制,并且几乎没有理由想要这种自动跟踪功能(而不是,例如,您自己管理的显式池).

但要直接回答您的要求,您需要:

  1. 手动跟踪该类型的所有可到达实例(可能带有一组弱引用,以防止跟踪器本身延长对象的生命周期).
  2. 提供一种机制(比方说)对该组的每个成员执行副作用.
  3. 当对象被销毁时,摆脱集合中相关的弱引用.这对于防止弱参考泄漏是必要的.

所有这些都必须以线程安全的方式完成.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你确定你需要所有这些吗?这一切都非常奇怪且非确定性(将在垃圾收集发生时受到严重影响).