@romaro

Как удалить событие, добавленное в виде лямбда-выражения?

При повторном вызове этого кода событие оказывается добавленным дважды:
_openMenuItem.Click -= (object? sender, EventArgs e) => Open_Click((int)id);
_openMenuItem.Click += (object? sender, EventArgs e) => Open_Click((int)id);
  • Вопрос задан
  • 85 просмотров
Решения вопроса 2
@joyrax-dev
EventHabdler handler = (sender, e) => myfunction();

_openMenuItem.Click -= handler;
_openMenuItem.Click += handler;

В точности не помню синтаксис, но смысл понятен
Ответ написан
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
В общем случае нельзя, так как объект лямбды создается каждый, поэтому нужно вынести функцию отдельно.
Но если регистрация и удаление обработчика происходят в одной функции/блоке, то ответ joyrax-dev будет правильным.
Но можно сделать такой костыль:
public class MyEvent
{
    public event EventHandler ActionHappened;

    public void FireEvent()
    {
        ActionHappened?.Invoke(this, EventArgs.Empty);
    }
}

public class SomeClass
{
    public void RegisterInner(MyEvent @event)
    {
        EventHandler handler = null!;
        handler = (sender, args) =>
        {
            Console.WriteLine("Hello, world");
            @event.ActionHappened -= handler;
        };

        @event.ActionHappened += handler;
    }
}
public class Program
{
    public static void Main()
    {
          var myEvent = new MyEvent();
          var someClass = new SomeClass();
          someClass.RegisterInner(myEvent);
          myEvent.FireEvent();
          myEvent.FireEvent();
          myEvent.FireEvent();
          myEvent.FireEvent();
          myEvent.FireEvent();
     }
}

Hello, world будет выведен только 1 раз
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы