2

我想我想做的很简单,但我做不到

我在 A 类的某处有一个静态事件:

public static event Action OnInvalidated;

当我的数据无效时我会调用它。当我实例化一个 B 类型的新类时,我想做以下事情:

A.OnInvalidated+= () => this.RefreshColumns();

基本上我想在 OnInvalidated 触发时对每个注册的实例调用 RefreshColumns。

这编译得很好,但是当我处理我的对象时如何删除 lambda 函数?我认为这样做

 A.OnInvalidated-= () => this.RefreshColumns();

行不通,我也不能申报

Action myAction = () => this.RefreshColumns();

作为函数成员

4

2 回答 2

2

尝试如下:

class A : IDisposable
{
    public static event Action OnInvalidated;

    public A()
    {
        A.OnInvalidated +=  this.SomeMethod();
        A.OnInvalidated +=  this.SomeOtherMethod();
    }

        public void Dispose()
        {
        A.OnInvalidated -=  this.SomeMethod();
        A.OnInvalidated -=  this.SomeOtherMethod();
        }

    public SomeMethod()
    {

    }

    public SomeOtherMethod()
    {

    }
}

请注意,如果要避免内存泄漏,请务必在 Dispose() 中实现 IDisposable 并取消订阅所有静态事件。否则静态事件的订阅者将永远不会被垃圾收集,因为事件维护对对象的引用。

于 2012-09-04T17:05:09.913 回答
1

首先,而不是这样做:

A.OnInvalidated+= () => this.RefreshColumns();

只需直接分配方法(注意()缺少以及 lambda 声明):

A.OnInvalidated += this.RefreshColumns;

然后,当您取消订阅时,您只需执行以下操作:

A.OnInvalidated -= this.RefreshColumns;

我认为问题在于您在不需要时引入了此匿名 lambda,从而使取消订阅该方法变得更加困难。

于 2012-09-04T17:08:34.483 回答