2011-03-11 28 views
5

我知道很多人都问“我怎么退订下面的”退订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); 

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

我敢肯定,我可以使用反射和完全清除处理,但有一个更清洁的方式?

回答

5

不,你必须存储的代表引用,基本上。

请记住,你将要在以后取消一切。

+0

GRRRR。那么可能重新设计我的设计并在发布会中传递发件人? - 行动' - 非常感谢Jon。 – 2011-03-11 15:43:59

+1

约翰是谁? :) – jgauffin 2011-03-11 15:44:33

+0

@Adam:您还没有的上下文不够清晰的休息对我们说,你是否会想改变设计。我不知道如何通过一个发件人会帮助,虽然... – 2011-03-11 15:46:55

1

既然你写了这个:

我敢肯定,我可以使用反射和清除处理程序完全

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

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

可以使用lambda来创建以后可以使用委托实例退订:

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

myObject.MyEvent += a; 

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

这是一个敏锐的想法,问题在于这是一个循环,并且有很多这样的dto,所以我必须跟踪哪个DTO与哪个Action相关,哪些DTO可行,有点痛苦。 – 2011-03-11 15:52:12