单独打电话给代表?

twe*_*ypi 8 c# delegates

如果我有这样的代表:

 Delegate void Render();
 Render ToRender;
Run Code Online (Sandbox Code Playgroud)

并在这里使用它:

 ToRender += FunctionRender;
 ToRender += SomeOtherRender;
Run Code Online (Sandbox Code Playgroud)

我该如何制作它以便我可以单独调用每个功能?像这样的东西:

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


     render();


     EndRender();
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

您可以使用单独获取每个Delegate.GetInvocationList().

foreach (Render render in ToRender.GetInvocationList())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,GetInvocationList()只返回a Delegate[],但foreach在每个项目上都有隐式强制转换,这就是上述循环的工作原理.

哦,你应该先检查一下ToRendernull不是 - 否则你会得到一个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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

(由于对通用转换的限制,这很尴尬.)

这样你可以写:

foreach (Render render in ToRender.GetIndividualDelegates())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

不用担心是否ToRender为空.