我知道很多人都提出了“如何取消订阅以下内容”的问题
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
如果有可能我已经为此循环中的部分/全部对象设置了此处理程序,该怎么办?有没有办法取消订阅?
我确信我可以使用反射并完全清除处理程序,但有更简洁的方法吗?
答案 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);