我正在尝试从委托数组中调用委托函数。我已经能够创建委托数组,但是如何调用委托?
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 []类型而不是数组的名称(委托)来执行委托函数。
答案 0 :(得分:14)
如果它们的类型相同,为什么不将它们组合成一个多播委托?
static pd delegateInstance = new pd(MyClass.p1) + new pd(MyClass.p2) ...;
...
pd();
答案 1 :(得分:7)
public class MainClass
{
static void Main()
{
pd[0]();
pd[1]();
}
}
答案 2 :(得分:7)
在.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);
}
}
}
答案 3 :(得分:3)
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");
}
}
}
答案 4 :(得分: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());
}
}
}