UnHooking Events с Lambdas в С#

Я часто сталкиваюсь с ситуацией, когда хочу подписаться на событие, но я хочу использовать лямбда для этого:

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");

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как отменить событие. Поскольку лямбда создает анонимный делегат под капотом, мне нечего называть -= on.

Теперь я мог бы просто создать метод:

private void SomethingHappened(object sender, EventArgs args)
{
    Console.WriteLine("Something Happened");
}

И тогда я могу зацепить/отцепить все, что хочу:

observable.SomethingHappened += SomethingHappened;
observable.SomethingHappened -= SomethingHappened;

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

Я уверен, что мне не повезло... но мне было интересно, если кто-нибудь там выяснит способ сделать это?

Ответ 1

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

  • Используйте метод, описанный вами
  • Назначьте лямбда переменной и используйте переменную для добавления/удаления события

Ответ 3

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

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