Как проверить, зарегистрирован ли обработчик событий - PullRequest
2 голосов
/ 13 июля 2011

У меня есть класс X, и у этого класса есть событие: EventX.

И у меня есть класс B, я регистрирую событие EventX объекта X для обработчика событий HandlerB класса B.

X objectX = X.GetStaticObject();
objectX.EventX += HandlerB;

Как проверить EventX объекта X, содержащий обработчик событий HandlerB. Спасибо.

Примечания: objectX - это статический глобал, событие которого может быть зарегистрировано из любого места с любыми объектами, которые не являются объектом B.

Ответы [ 3 ]

4 голосов
/ 13 июля 2011

Чтобы проверить, что именно ваш HandlerB был зарегистрирован, вы можете использовать Delegate.GetInvocationList () метод для получения соответствующей информации.

EDIT:

После комментария V4Vendetta я попытался скомпилировать код, но это не удалось. Я немного изменил это.

Чтобы сделать эту проверку, метод X должен быть добавлен к X (я предполагаю, что он статический, в противном случае используйте это вместо X):

public static void Test(Delegate delegateToTest)
{
   if (X.EventX != null)
   {
       foreach (Delegate existingHandler in X.EventX.GetInvocationList())
       {
           if (existingHandler == delegateToTest)
           {
               // registered
           }
       }
    }
}

А затем проверить откуда-нибудь, где доступен HandlerB:

X.Test(new EventHandler(HandlerB));
3 голосов
/ 13 июля 2011

Если оно не равно нулю, оно регистрируется (хотя может быть с пустым обработчиком).

if(objectX.EventX != null)
{
  // registered!
}

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

0 голосов
/ 13 июля 2011

Если вы хотите, чтобы обработчик событий не регистрировался дважды для одного и того же события, вы можете удалить его до регистрации - что-то вроде этого:

objectX.EventX -= HandlerB; 
objectX.EventX += HandlerB;

Это можно сделать в регистрационном коде или даже в самом событии. Посмотрите на этот вопрос для деталей.

Примечание : удаление HandlerB не должно завершиться ошибкой, даже если оно не было зарегистрировано ранее! (Если кто-то не изменил часть remove в явном определении события, чтобы сделать это.)

...