如果我有这样的代表:
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在每个项目上都有隐式强制转换,这就是上述循环的工作原理.
哦,你应该先检查一下ToRender是null不是 - 否则你会得到一个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为空.
| 归档时间: |
|
| 查看次数: |
1788 次 |
| 最近记录: |