Call delegates individually?

if I have a delegate like this:

 Delegate void Render();
 Render ToRender;

And use it here:

 ToRender += FunctionRender;
 ToRender += SomeOtherRender;

How can I do this so that I can call each function every time? Something like that:

 foreach(Render render in ToRender)
 {
     BeginRender();


     render();


     EndRender();
 }
+5
source share
4 answers

You can select each one separately using Delegate.GetInvocationList().

foreach (Render render in ToRender.GetInvocationList())
{
    ...
}

Note that it GetInvocationList()simply returns Delegate[], but foreachhas an implicit cast to each element, which makes the work of this loop higher.

, , ToRender null , - NullReferenceException. , , , #: (

, :

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 .

+11
foreach (Render render in ToRender.GetInvocationList())

:

Render temp = ToRender;

if (temp != null)
{
    foreach (Render render in temp.GetInvocationList())
    {
        BeginRender();

        render();

        EndRender();
    }
}
+3

ToRender.GetInvocationList , "".

+1

, . . . , .

maybe 3 events / delegates - similar to the asp.net way. PreRender, Render, and PostRender. I'm not sure what you are doing, but that sounds like overkill to me. just thought I would throw him away.

0
source

All Articles