C#中的委托数组

本文关键字:数组 | 更新日期: 2023-09-27 17:47:47

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

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]
    }
}

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

C#中的委托数组

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

static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...;
...
pd();
public class MainClass
{
    static void Main()
    {
        pd[0]();
        pd[1]();
    }
}

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

您可以通过对委托本身调用方法GetInvocationList()来访问此列表。此方法返回委托的数组。。。

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

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

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);
          }
     }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        pd[0]();
        pd[1]();
    }
    public delegate void delegates();
    static delegates[] pd = new delegates[] 
                            { 
                               new delegates(MyClass.p1), 
                               new delegates(MyClass.p2) 
                            };
    public static class MyClass
    {
        public static void p1()
        {
            MessageBox.Show("1");
        }
        public static void p2()
        {
            MessageBox.Show("2");
        }
    }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        pd[0](1);
        pd[1](2);
    }
    public delegate void delegates(int par);
    static delegates[] pd = new delegates[] 
                                     { 
                                      new delegates(MyClass.p1), 
                                      new delegates(MyClass.p2) 
                                     };
    public static class MyClass
    {
        public static void p1(int par)
        {
            MessageBox.Show(par.ToString());
        }
        public static void p2(int par)
        {
            MessageBox.Show(par.ToString());
        }

    }
}