单独召集代表? [英] Calling delegates individually?

查看:113
本文介绍了单独召集代表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个这样的代表:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆