В .Net любой делегат на самом деле является «многоадресным» делегатом (он наследует от этого встроенного базового класса) и поэтому содержит внутренний связанный список, который может содержать любое количество целевых делегатов.
Вы можете получить доступ к этому списку, вызвав метод GetInvocationList () для самого делегата. Этот метод возвращает массив делегатов ...
Единственное ограничение заключается в том, что все делегаты в связанном списке данного делегата должны иметь одну и ту же подпись (быть одного типа делегата). Если вам нужно, чтобы ваша коллекция могла содержать делегатов разнородных типов, вам нужно создать свой собственный список или класс коллекции.
Но если это нормально, тогда вы можете "вызвать" делегатов в списке вызовов данного делегата следующим образом:
public delegate void MessageArrivedHandler(MessageBase msg);
public class MyClass
{
public event MessageArrivedHandler MessageArrivedClientHandler;
public void CallEachDelegate(MessageBase msg)
{
if (MessageArrivedClientHandler == null)
return;
Delegate[] clientList = MessageArrivedClientHandler.GetInvocationList();
foreach (Delegate d in clientList)
{
if (d is MessageArrivedHandler)
(d as MessageArrivedHandler)(msg);
}
}
}