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

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

Мне нужен способ выполнить следующий код:

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

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

Спасибо заранее.

2 ответа

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

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

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

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


Мой ответ скорее является комментарием для Томаса Левеска, но я не могу комментировать, так что здесь ничего не происходит. Я считаю эту область С# немного уродливой, так как есть возможность ввести условия гонки - то есть разные потоки могут участвовать в гонке, и вы можете ввести оператор 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();

... просто быть более безопасным.

licensed under cc by-sa 3.0 with attribution.