Вы можете получить каждый из них отдельно, используя Delegate.GetInvocationList()
.
foreach (Render render in ToRender.GetInvocationList())
{
...
}
Обратите внимание, что GetInvocationList()
просто возвращает Delegate[]
, но foreach
имеет неявное приведение к каждому элементу, что и делает приведенный выше цикл.
Да, и вы должны проверить, является ли ToRender
1013 * или нет первым, конечно, иначе вы получите NullReferenceException
. На самом деле вы могли бы написать общий метод расширения, чтобы сделать это лучше, но вам нужно ограничение на тип делегата, которое не разрешено в C #: (
Если вас не волнует отсутствие ограничений, вы можете подделать его:
public static IEnumerable<T> GetIndividualDelegates<T>(this T multiDelegate)
where T : class
{
if (multiDelegate == null)
{
yield break;
}
Delegate d = (Delegate)(object) multiDelegate;
foreach (Delegate item in d.GetInvocationList())
{
yield return (T)(object) item;
}
}
(Это неудобно из-за ограничений на общие преобразования.)
Так вы могли бы написать:
foreach (Render render in ToRender.GetIndividualDelegates())
{
...
}
не беспокоясь о том, был ли ToRender
нулевым или нет.