2011-03-11 4 views
5

나는 많은 사람들이탈퇴 람다 이벤트 처리기는 ** 폐쇄와 함께 **

EventHandler HelloWorld = delegate { MessageBox.Show("Hello World!"); }; 
myButton.Click -= HelloWorld; 
myButton.Click += HelloWorld; 
의 명백한 대답

myButton.Click += (s, e) => MessageBox.Show("Hello World!"); 

"어떻게 다음 취소 않습니다"라는 질문을 한 알

하지만 람다를 사용하여 클로저를 만드는 방법은 무엇입니까? 내 객체 유형 Action이다 AssessmentRationChanged라는 이벤트를 가지고, 내가 thusly 히 그것을 배선있어 어떤 경우 : 이미 일부에 대해이 핸들러를 설정 한 기회가있다

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

어떤 경우/모든 개체에 이 루프? 그 (것)들을 구독 취소하는 방법 있는가?

나는 리플렉션을 사용할 수 있고 핸들러를 완전히 지울 수 있다고 확신하지만 깨끗한 방법이 있습니까?

답변

5

아니요, 기본적으로 대리인에 대한 참조를 저장해야합니다.

나중에 탈퇴하려는 모든 것을 기억하십시오.

+0

Grrrr. 그래서 아마도 내 디자인을 다시 작업하고 이벤트에 함께 발신자를 전달합니까? -'Action '- 언제나처럼 Jon. –

+1

John은 누구입니까? :) – jgauffin

+0

@ Adam : 디자인 변경 여부를 알리는 데 필요한 문맥의 나머지 부분을 명확히하지 않았습니다. 나는 보낸 사람을 어떻게 통과하는 것이 도움이 될지 모르겠다. –

1

이 쓴 이후 :

내가 대신 이벤트의 간단한 대리자를 사용하여 완전히

가 확실한 대답이 될 것이다 반사를 사용하고 핸들러를 취소 할 수 확신 :

foreach (MassFMVUpdateDTO dto in CurrentProperties) 
    dto.AssessmentRationChanged =() => setCellColorBasedOnAssessmentRatioValue(dto); 
당신은 나중에 사용할 수있는 대리자 인스턴스를 만들 수 람다를 사용할 수 있습니다
4

탈퇴하기 :

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

myObject.MyEvent += a; 

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

그것은 날카로운 생각입니다. 문제는 이것이 루프에 있고, 그러한 많은 dto가 있다는 것입니다. 그래서 어떤 Action이 어떤 DTO를 가지고 있는지 추적해야합니다. DTO는 수행 할 수 있지만 약간의 고통입니다 . –

관련 문제