c# - 单独调用委托(delegate)?

标签 c# delegates

如果我有这样的委托(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/

相关文章:

c# - 在不触发事件的情况下设置 WPF 依赖属性

c# - 多线程运行时在哪里调用Control.Invoke/BeginInvoke?

javascript - 无法在 keydown 上运行 .live...有什么建议吗?

c# - 在应用依赖注入(inject)时,Func<in T, out TResult> 是否适合用作 ctor arg?

ios - 将 App Delegate 从 Objective-C 换成 Swift?

c# - 使用 VB.net 或 C# (SSIS) 将图像写入磁盘

c# - 将 Perl 正则表达式转换为 .NET

C# 我可以将命令提示符控件添加到我的应用程序吗

c# - 添加相对于 TreeView 选定节点的新节点

c# - .NET 中委托(delegate)的目的是什么