Возможный дубликат:
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 больше не вызывался.
Ответ 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;