如果我有这样的委托(delegate):
Delegate void Render();
Render ToRender;
并在这里使用它:
ToRender += FunctionRender;
ToRender += SomeOtherRender;
我怎样才能做到这样才能分别调用每个函数?像这样:
foreach(Render render in ToRender)
{
BeginRender();
render();
EndRender();
}
最佳答案
您可以使用 Delegate.GetInvocationList()
分别获取每一个.
foreach (Render render in ToRender.GetInvocationList())
{
...
}
注意 GetInvocationList()
只返回一个 Delegate[]
,但是 foreach
对每个项目都有一个隐式转换,这就是上面的循环工作。
哦,当然,您应该首先检查 ToRender
是否为 null
- 否则您将得到一个 NullReferenceException
。您实际上可以编写一个通用扩展方法来使它更好,但是您需要对委托(delegate)类型进行约束,这在 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
是否为 null。
关于c# - 单独调用委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4451436/