繁体   English   中英

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

[英]Unsubscribe Lambda Event Handler **With Closure**

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

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

有了明显的答案

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

但我正在使用lambda创建一个闭包? 如果我的对象有一个名为AssessmentRationChanged且属于Action类型的事件,我将如此布线:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM