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

标签 c# types methods instance

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

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

最佳答案

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);
        }
    }
}

你确定你需要所有这些吗?这一切都非常奇怪且不确定(会受到垃圾收集发生的时间的严重影响)。

关于c# - 在 C# 中调用类型的每个实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8612284/

相关文章:

c# - C#中如何在WebBrowser控件中加载本地HTML页面

c# - 测试空数组索引

C计算和类型转换混合类型

java - 私有(private)类从其外部类调用方法

iOS Objective C 方法问题

c# - 绑定(bind) ComboBox ItemsSource 在 WPF 中不起作用

c# - CollectionView,SelectedItems ="{Binding SelectedElement, Mode=TwoWay}"不起作用

c - vim:显示 C 聚合(结构/union )成员的类型,即使是嵌套的

types - 在类型化 Racket 中的集合列表上使用 apply 时出现奇怪的类型检查器行为

objective-c - 从 objective-c 调用多个参数到 applescript-objc