Отмена событий с лямбдами в C # - PullRequest
5 голосов
/ 13 мая 2009

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

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 ]

10 голосов
/ 14 мая 2009

Этот вопрос уже задавался

Ответ таков: поместите лямбду в переменную.

EventHandler handler = (sender, args) => Console.WriteLine("Something Happened");
observable.SomethingHappened +=  handler;
observable.SomethingHappened -=  handler;
8 голосов
/ 13 мая 2009

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

  • Используйте метод, который вы описали
  • Присвойте лямбду переменной и используйте переменную для добавления / удаления события
0 голосов
/ 13 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...