取消订阅Lambda事件处理程序**关闭**

时间:2011-03-11 15:39:48

标签: c# lambda closures

我知道很多人都提出了“如何取消订阅以下内容”的问题

myButton.Click += (s, e) => MessageBox.Show("Hello World!");

明显回答

EventHandler HelloWorld = delegate { MessageBox.Show("Hello World!"); };
myButton.Click -= HelloWorld;
myButton.Click += HelloWorld;

但是我使用lambda来创建一个闭包?如果我的对象有一个名为AssessmentRationChanged的{​​{1}}类型的事件,我将如此布线,那该怎么办:

Action

如果有可能我已经为此循环中的部分/全部对象设置了此处理程序,该怎么办?有没有办法取消订阅?

我确信我可以使用反射并完全清除处理程序,但有更简洁的方法吗?

3 个答案:

答案 0 :(得分:5)

不,你必须基本上存储对代表的引用。

记住以后要取消订阅的所有内容。

答案 1 :(得分:4)

您可以使用lambda创建一个委托实例,稍后可以使用该实例取消订阅:

 Action a = () => setCellColorBasedOnAssessmentRatioValue(dto);

 myObject.MyEvent += a;

 // to unsubscribe:
 myObject.MyEvent -= a;

答案 2 :(得分:1)

既然你写了这个:

  

我确信我可以使用反射并完全清除处理程序

显而易见的答案是使用简单的委托而不是事件:

foreach (MassFMVUpdateDTO dto in CurrentProperties)
   dto.AssessmentRationChanged = () => setCellColorBasedOnAssessmentRatioValue(dto);