2011-03-11 45 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