Как узнать, сколько обработчиков событий для события? - PullRequest
4 голосов
/ 22 августа 2010

Как узнать, сколько обработчиков событий для события?

Я хочу выполнить следующий код:

// if (control.CheckedChanged.Handlers.Length == 0)
{
    control.CheckedChanged += (s, e) =>
    {
      // code;
    }
}

Примечание: этот код находится вне класса управления.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 22 августа 2010

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

if (MyEvent!= null)
{
    EventHandler[] handlers = (EventHandler[])MyEvent.GetInvocationList();
    foreach(EventHandler handler in handlers)
    {
        ...
    }
}

Или, за то, что вы пытаетесь сделать:

if (CheckedChanged == null)
{
    CheckedChanged += (s, e) =>
    {
      // code;
    }
}
1 голос
/ 22 августа 2010

Мой ответ - скорее комментарий для Томаса Левеска, но я пока не могу комментировать, так что здесь ничего не говорится. Я нахожу эту область C # немного уродливой, так как есть возможность ввести условия гонки - то есть могут участвовать разные потоки, и вы можете ввести оператор if с CheckedChanged != null

if (CheckedChanged == null)
{
    CheckedChanged += (s, e) =>
    {
      // code;
    }
}

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

//Invoke SomeEvent if there are any handlers  attached to it.
if(SomeEvent != null) SomeEvent(); 

Но SomeEvent может быть обнулен в процессе, поэтому было бы безопаснее написать что-то вроде этого

SomeEVentHandler handler = SomeEvent;
if (handler != null) handler();

... просто для большей безопасности.

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