在C#中委托数组

9

我正在尝试从委托数组中调用委托函数。我已经成功创建了委托数组,但是如何调用委托呢?

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[]类型而不是数组名称(delegates)来执行委托函数。

5个回答

15

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

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

...
pd();

不这样做的一个原因是要单独处理由任何委托抛出的异常,而不仅仅是捕获第一个异常。 - Jacob Carpenter
根据我的编辑,委托不是响应事件而执行的,而是使用数组中的索引单独调用的。 - pro3carp3
@jacob_c - 是的,如果你真的想要 :)@pro3carp3 - 在这种情况下,您只需要按照数组的正常索引访问它即可。这里的委托没有什么特别之处。 - Jon Skeet
谢谢,Jon。我犯了一个愚蠢的错误,以为我漏掉了什么东西。 - pro3carp3

7
public class MainClass
{
    static void Main()
    {
        pd[0]();
        pd[1]();
    }
}

从技术上讲,应该是MyClass.pd [0]()。pd是一种类型,而MyClass.pd是MyClass的静态成员。 - Mark Brackett
为什么不把这些PD合并在一起呢! - Jb Evain

7
在 .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);
          }
     }
}

4
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");
        }
    }
}

这里应该用“delegate”,而不是“delegates”。 - Davide Andrea

0
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());
        }


    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接