单独召集代表? [英] Calling delegates individually?
问题描述
如果我有一个这样的代表:
if I have a delegate like so:
Delegate void Render();
Render ToRender;
并在此使用:
ToRender += FunctionRender;
ToRender += SomeOtherRender;
如何使它能够单独调用每个功能?这样做:
How can I make it so I can invoke each function seperately? Something like this:
foreach(Render render in ToRender)
{
BeginRender();
render();
EndRender();
}
推荐答案
您可以分别获取每个使用 Delegate.GetInvocationList()
。
You can fetch each one separately using Delegate.GetInvocationList()
.
foreach (Render render in ToRender.GetInvocationList())
{
...
}
请注意, GetInvocationList )
只返回一个 Delegate []
,但 foreach
在每个项目上都有一个隐式转换,这是什么使上述循环工作。
Note that GetInvocationList()
just returns a Delegate[]
, but foreach
has an implicit cast on each item, which is what makes the above loop work.
哦,你应该检查是否 ToRender
是 null
或者不是第一,当然 - 否则你会得到一个 NullReferenceException
。你可以写一个通用的扩展方法来使这个更好,但是你需要对C#中不允许的委托类型有一个限制:(
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<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;
}
}
(由于通用转化的限制,这很尴尬。)
(It's awkward because of the restrictions on generic conversions.)
这样你可以写:
foreach (Render render in ToRender.GetIndividualDelegates())
{
...
}
不用担心是否 T oRender
为空。
这篇关于单独召集代表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!