取消订阅Lambda事件处理程序**封闭**
我知道很多人都问过“我如何取消订阅以下内容”
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);
链接地址: http://www.djcxy.com/p/51471.html