[英]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.