Отключение событий с лямбдами в C#
Я часто сталкиваюсь с ситуацией, когда хочу подписаться на событие, но я хочу использовать лямбду для этого:
public class Observable
{
public event EventHandler SomethingHappened;
public void DoSomething()
{
// Do Something...
OnSomethingHappened();
}
}
// Somewhere else, I hook the event
observable.SomethingHappened += (sender, args) => Console.WriteLine("Something Happened");
Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как отцепить событие. Поскольку лямбда создает анонимного делегата под капотом, мне нечего звонить -=
на.
Теперь я мог бы просто создать метод:
private void SomethingHappened(object sender, EventArgs args)
{
Console.WriteLine("Something Happened");
}
И тогда я могу зацепить / отцепить все, что я хочу:
observable.SomethingHappened += SomethingHappened;
observable.SomethingHappened -= SomethingHappened;
Но я бы очень, очень, очень хотел бы использовать вместо этого свою лямбду. В более сложном примере лямбды здесь очень пригодятся.
Я почти уверен, что мне не повезло... но мне было интересно, кто-нибудь там нашел способ сделать это?
3 ответа
К сожалению, нет хорошего способа сделать это. Вы действительно застряли с одним из двух вариантов
- Используйте метод, как вы описали
- Присвойте лямбду переменной и используйте переменную для добавления / удаления события
Этот вопрос уже задавался
Ответ: поместите свою лямбду в переменную.
EventHandler handler = (sender, args) => Console.WriteLine("Something Happened");
observable.SomethingHappened += handler;
observable.SomethingHappened -= handler;
Что ж, если вы знаете, что ваш код - единственный, кто подключает событие, то присвоение нуля переменным события удалит всех делегатов (но может быть очень плохой формой, если вы хотите, чтобы код был расширяемым).
В противном случае вы должны просто хранить лямбду в отдельной переменной и использовать ее для отмены события.