Словарь событий - PullRequest
       15

Словарь событий

2 голосов
/ 06 января 2012

Есть ли в c # что-нибудь, что вы можете использовать для создания коллекции событий, таких как списки, хэш-наборы и словарь в этом случае?Thankyou.

Ответы [ 3 ]

6 голосов
/ 06 января 2012

Конечно, вы можете:

Dictionary<String, Delegate> m_events = new Dictionary<String, Delegate>();

В книге Джеффа Рихтера CLR через C # вы можете найти полную реализацию класса EventSet.

(Даже если у вас нет книги, вы можете загрузить образец кода с https://www.wintellect.com/wp-content/uploads/2017/09/CLR-via-C-4th-Edition-Code.zip. Данный класс находится в "Ch11-1-EventSet.cs".)

Что касается вопроса, что такое событие:

Скажем, у вас есть строка кода в вашем классе:

public event EventHandler<NewMailEventArgs> NewMail;

тогда компилятор C # преобразует строку выше в три конструкции:

  1. Поле частного делегата. (Что-то вроде: private EventHandler<NewMailEventArgs> NewMail;

  2. Открытый метод add_Xxx (где Xxx - имя события), который заинтересованные подписчики могут использовать для регистрации делегата обратного вызова в событии.

  3. Открытый метод remove_Xxx (где Xxx - имя события), который подписчики могут использовать для отмены регистрации в событии.

(Все подробности можно найти в разделе 11.2 вышеупомянутой книги.)

Другими словами, «вещь», которую вы можете сохранить в своем классе коллекции Event, - это просто старый делегат, ничего больше.

2 голосов
/ 06 января 2012

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

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

РЕДАКТИРОВАТЬ:

Ах, я думаю, я понял это сейчас.Если вы просто запустите свое событие, его получат только те экземпляры, которые хотят его.Если вы передадите в аргументы события экземпляр A, который вызвал событие, то экземпляр B сможет определить, откуда оно пришло.Но B никогда не получит событие от A, которое не запросило событие.

РЕДАКТИРОВАТЬ:

Возможно, нет.Вы хотите запустить событие только на одном из B?Заставьте B реализовать интерфейс с методом обратного вызова.Вместо того, чтобы вызывать событие, вызовите метод на правильном экземпляре B.

0 голосов
/ 06 января 2012

Вы можете использовать IList без каких-либо проблем. Тип T может быть любым типом, определенным в .net или пользовательском классе.

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