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

我知道很多人都问过“我如何取消订阅以下内容”

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

有了明显的答案

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

但是,我使用lambda来创建一个闭包? 如果我的对象有一个名为AssessmentRationChangedAction类型的事件,我就这样连线:

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

如果有机会,我已经为这个循环中的一些/所有对象设置了这个处理程序呢? 有没有办法取消订阅他们?

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


不,您必须基本上将参考文件存储到代表。

记住您稍后想要取消订阅的所有内容。


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

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

 myObject.MyEvent += a;

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

既然你写了这个:

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

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

foreach (MassFMVUpdateDTO dto in CurrentProperties)
   dto.AssessmentRationChanged = () => setCellColorBasedOnAssessmentRatioValue(dto);
链接地址: http://www.djcxy.com/p/51471.html

上一篇: Unsubscribe Lambda Event Handler **With Closure**

下一篇: C# Events and Thread Safety