委托数组

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

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

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

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

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

您可以通过在委托本身上调用方法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); } } } 
 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()); } } }