Calling delegates individually?

前端 未结 4 1548
逝去的感伤
逝去的感伤 2021-02-15 02:56

if I have a delegate like so:

 Delegate void Render();
 Render ToRender;

And use it here:

 ToRender += FunctionRender;
 ToRende         


        
4条回答
  •  猫巷女王i
    2021-02-15 03:10

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

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

    Note that GetInvocationList() just returns a Delegate[], but foreach has an implicit cast on each item, which is what makes the above loop work.

    Oh, and you should check whether ToRender is null or not first, of course - otherwise you'll get a NullReferenceException. You could actually write a generic extension method to make this nicer, but you'd need a constraint on the delegate type which isn't allowed in C# :(

    If you don't care about the lack of constraints, you could fake it:

    public static IEnumerable GetIndividualDelegates(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;
        }    
    }
    

    (It's awkward because of the restrictions on generic conversions.)

    That way you could write:

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

    without worrying about whether ToRender was null or not.

提交回复
热议问题