Отписаться Лямбда-обработчик событий ** С закрытием ** - PullRequest
5 голосов
/ 11 марта 2011

Я знаю, что многие люди задавали вопрос "как мне отписаться от следующего"

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

С очевидным ответом

EventHandler HelloWorld = delegate { MessageBox.Show("Hello World!"); };
myButton.Click -= HelloWorld;
myButton.Click += HelloWorld;

Но что яиспользуя лямбду, чтобы создать замыкание?Что, если у моего объекта есть событие с именем AssessmentRationChanged, которое имеет тип Action, и я подключаю его таким образом:

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

Что если есть вероятность, что я уже установил этот обработчик для некоторых/ все объекты в этом цикле?Есть ли способ отменить их подписку?

Я уверен, что мог бы использовать отражение и полностью очистить обработчик, но есть ли более чистый способ?

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Нет, вы должны хранить ссылки на делегатов, в основном.

Запомните все, что вы хотите отписаться позже.

4 голосов
/ 11 марта 2011

Вы можете использовать лямбду для создания экземпляра делегата, который вы можете использовать позже, чтобы отписаться:

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

 myObject.MyEvent += a;

 // to unsubscribe:
 myObject.MyEvent -= a;
1 голос
/ 11 марта 2011

Так как вы написали это:

Я уверен, что смогу использовать отражение и полностью очистить обработчик

Очевидным ответом будет использование простого делегата вместо события:

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