Обработчики событий C # - PullRequest
9 голосов
/ 24 октября 2008

Как я могу проверить в C #, если с событием button.Click связаны какие-либо обработчики? If (button.Click! = Null) выдает ошибку компиляции.

Ответы [ 4 ]

17 голосов
/ 24 октября 2008

Вы не можете. События просто выставляют «добавить обработчик» и «удалить обработчик» - вот и все. (На самом деле в CLR у вас также могут быть метаданные, чтобы связать метод с «запуском события», но компилятор C # никогда этого не генерирует.) Некоторые издатели событий могут предлагать дополнительные средства для проверки наличия подписчиков (или даже вы видите этих подписчиков), но это не является частью самого шаблона события.

См. мою статью о событиях для получения дополнительной информации или посмотрите тег events (который я собираюсь добавить к этому вопросу).

1 голос
/ 24 октября 2008

Зачем тебе это? Каков контекст? Может быть, есть лучший способ добиться результата
Кнопка является внешним объектом, и вы пытаетесь проверить, является ли он внутренним списком подписчиков, не спрашивая его. Это нарушает инкапсуляцию ..
Вы должны всегда позволять объекту управлять подписчиками на события, которые он выставляет. Если бы он хотел, чтобы клиенты знали, он бы выставил метод HasClientsRegistered. Не врывайся.

0 голосов
/ 29 июня 2010

EventDescriptor e = TypeDescriptor.GetEvents (yourObject) .Find ("yourEventName", true);

0 голосов
/ 24 октября 2008

Я думаю, что вы можете, если вы находитесь в классе, который поднимает событие.

Вы можете определить обработчик и перечислить каждый.

например. Если ваше событие определено как

event System.EventHandler NewEvent;

Тогда вы можете создать метод события, который вы можете создать ...

    EventHandler handler = NewEvent;
    if(handler != null)
    {
      handler(this, e);
    }

Это даст вам обработчик, и из него вы сможете получить список вызовов.

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