Отключение событий с лямбдами в 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;

Что ж, если вы знаете, что ваш код - единственный, кто подключает событие, то присвоение нуля переменным события удалит всех делегатов (но может быть очень плохой формой, если вы хотите, чтобы код был расширяемым).

В противном случае вы должны просто хранить лямбду в отдельной переменной и использовать ее для отмены события.

Другие вопросы по тегам