Сохраните список EventHandlers, чтобы отписаться от - PullRequest
4 голосов
/ 13 мая 2011

У меня есть класс с методом Register, который подписывается на ряд событий в классах, которые он содержит, используя стандарт aClass.SomeEvent += the_handler. Этот класс также имеет метод Unregister, который отписывается от этих событий, используя -=. Это прекрасно работает, но мы обнаруживаем, что если мы добавляем новое событие для подписки, очень легко забыть включить отписку в Unregister. Этот ручной метод поддержки подписок на события оказывается хрупким.

Есть ли способ вести список подписок, который можно динамически перебирать и отменять? (И, возможно, выполнять итерацию и повторную подписку при вызове Register после Unregister).

Некоторые подробности: класс имеет ссылку на 3 других класса (в настоящее время, но не ограничен 3), различные события в этих классах имеют тип EventHandler или EventHandler<T>.

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

как насчет получения списка вызовов из EventHandler.GetInvocationList(), а затем выполнить его итерацию и вручную удалить / отменить регистрацию? обратите внимание, что у вас есть доступ к методу GetInvationList () только из класса, в котором есть этот EventHandler, поэтому вам может потребоваться предоставить метод UnregisterAll (), чтобы убедиться, что он удаляет все делагаты в списке вызовов событий

вы также можете убедиться, что ваш класс наследует IDisposable, а с using(){ } он вызовет Dispose, который очистит всех подписчиков

0 голосов
/ 16 мая 2011

После тщательного просмотра ТАК я нашел ответ:

C # Динамическая подписка на события

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

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