Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как удалить метод из делегата действия в C #

Автор вопроса: HeisenbugОтветов: 2

Возможный дубликат:
C # Добавление и Удаление анонимного обработчика событий

предположим, у меня есть делегат действия, объявленный следующим образом:

public event Action<MenuTraverser.Actions> menuAction;

Я связываю с ним метод таким образом:

menuInputController.menuAction += (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);

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

menuInputController.menuAction -= (MenuTraverser.Actions action) => this.traverser.OnMenuAction(action);

Как я могу это сделать? Мне нужно, чтобы мой метод OnMenuAction больше не вызывался.

  • Возможно, stackoverflow.com/questions/91778/? Matten 11.12.2011

delegatesaction

Ответы

Ответ 1 · рейтинг 4 · Lucero

Поскольку ваша подпись кажется совпадающей (при условии, что у вас есть тип возвращаемого значения void), вам не нужно добавлять анонимную функцию, но вы можете напрямую использовать группу методов:

menuInputController.menuAction += this.traverser.OnMenuAction;

И в этом случае должна работать и отписка:

menuInputController.menuAction -= this.traverser.OnMenuAction;

Ответ 2 · рейтинг 5 · sll

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

// declare on a class fields level
Action<MenuTraverser.Action> cachedHandler;

// in constructor initialize
cachedHandler = (action) => this.traverser.OnMenuAction(action);

// subscribe
menuInputController.menuAction += cachedHandler;

// unsubscribe
menuInputController.menuAction -= cachedHandler;

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы