当前位置:  开发笔记 > 编程语言 > 正文

委托数组

如何解决《委托数组》经验,为你挑选了3个好方法。

我正在尝试从委托数组中调用委托函数.我已经能够创建委托数组,但是如何调用委托?

public delegate void pd();

public static class MyClass
{

    static void p1()
    {
        //...
    }

    static void p2 ()
    {
        //...
    }

    //...

    static pd[] delegates = new pd[] {

        new pd( MyClass.p1 ),
        new pd( MyClass.p2)
        /* ... */
    };
}

public class MainClass
{
    static void Main()
    {
        // Call pd[0]
        // Call pd[1]
    }
}

编辑: 数组的原因是我需要根据需要通过索引调用委托函数.它们不是为响应事件而运行的.我在代码中看到一个严重(愚蠢)的错误,因为我试图使用pd []类型而不是数组的名称(委托)来执行委托函数.



1> Jon Skeet..:

如果它们都是相同的类型,为什么不将它们组合成单个多播委托?

static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...;

...
pd();



2> Romain Verdi..:
public class MainClass
{
    static void Main()
    {
        pd[0]();
        pd[1]();
    }
}



3> Charles Bret..:

在.Net中,任何委托实际上实际上都是一个"多播"委托(它继承自这个内置的基类),因此包含一个内部链表,它可以包含任意数量的目标委托.

您可以通过调用委托本身上的方法GetInvocationList()来访问此列表.此方法返回一个Delegates数组...

唯一的限制是给定委托的链表中的所有委托必须具有相同的签名(具有相同的委托类型).如果您需要您的集合能够包含不同类型的委托,那么您需要构建自己的列表或集合类.

但是如果这没关系,那么你可以"调用"给定委托的调用列表中的委托,如下所示:

public delegate void MessageArrivedHandler(MessageBase msg);
public class MyClass
{
     public event MessageArrivedHandler MessageArrivedClientHandler;   

     public void CallEachDelegate(MessageBase msg)
     {
          if (MessageArrivedClientHandler == null)
              return;
          Delegate[] clientList = MessageArrivedClientHandler.GetInvocationList();
          foreach (Delegate d in clientList)
          {
              if (d is MessageArrivedHandler)
                  (d as MessageArrivedHandler)(msg);
          }
     }
}

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有