我认为我想要做的事情非常简单,但我无法设法
我在A类的某个地方有一个静态事件:
public static event Action OnInvalidated;
我的数据无效时调用。 当我实例化一个新的B类时,我想做以下几点:
A.OnInvalidated+= () => this.RefreshColumns();
基本上我想在OnInvalidated触发时注册的每个实例上调用RefreshColumns。
这个编译很好,但是当我处理我的对象时如何删除lambda函数? 我认为这样做
A.OnInvalidated-= () => this.RefreshColumns();
无效,我无法宣布
Action myAction = () => this.RefreshColumns();
作为功能成员
答案 0 :(得分: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并取消订阅所有静态事件。否则静态事件的订阅者将永远不会被垃圾收集,因为事件维护对对象的引用。
答案 1 :(得分:1)
首先,而不是:
A.OnInvalidated+= () => this.RefreshColumns();
直接分配方法(注意缺少()
以及lambda声明):
A.OnInvalidated += this.RefreshColumns;
然后当您取消订阅时,只需:
A.OnInvalidated -= this.RefreshColumns;
我认为问题在于你在不需要时引入这个匿名lambda,这使得取消订阅该方法变得更加困难。