16.7 使用自定义委托
既然EventHandler委托不能使用了,那么就只能考虑使用自定义委托来声明事件了。首先,声明一个自定义委托:
public delegate void PrintEventDelegate(Object sender,PrintEventArgs e);
接下来,将事件声明中使用的预定义委托EventHandler换成我们自定义的委托:
public event PrintEventDelegate PrintComplete;
因为我们扩展的PrintEventArgs类没有不带参数的构造函数,因此需要修改事件触发部分的代码,传递一个参数进去,该参数的值就是要发送给事件处理方法的状态信息,这里以一个简单的字符串代替:
if(PrintComplete!=null)
{
PrintComplete(this,new PrintEventArgs(“测试消息”));
}
下面就是修改事件处理方法的签名了,将EventArgs参数换成PrintEventArgs参数类型,见代码清单16-5。
代码清单16-5 使用自定义的事件参数示例
//在屏幕上显示信息
public void ShowMessage(object sender,PrintEventArgs e)
{
Console.WriteLine(“打印已完成……”);
Console.WriteLine(“事件发布者发送的消息:{0}”,e.PrintState);
}
//模拟发送短消息到手机
public void SendSmsToMobile(object sender,PrintEventArgs e)
{
Console.WriteLine(“模拟发送短消息……”);
Console.WriteLine(“事件发布者发送的消息:{0}”,e.PrintState);
}
好了,现在运行程序,输出如下,事件处理方法成功地获得了事件发布者想要给它们的信息:
打印已完成……
事件发布者发送的消息:测试消息
模拟发送短消息……
事件发布者发送的消息:测试消息
下面是完整的代码,见代码清单16-6。
代码清单16-6 使用自定义委托声明事件的完整示例
1 using System;
2 namespace ProgrammingCSharp4
3{
4//自定义委托
5 public delegate void PrintEventDelegate(Object sender,PrintEventArgs e);
6 public class EventSample
7{
8//使用自定义委托的事件定义
9 public event PrintEventDelegate PrintComplete;
10
11 public void OnPrintComplete()
12{
13//判断是否绑定了事件处理方法,null表示没有事件处理方法
14 if(PrintComplete!=null)
15{
16 PrintComplete(this,new PrintEventArgs(“测试消息”));
17}
18}
19
20 public static void Main()
21{
22 EventSample eventSample=new EventSample();
23 Printer printer=new Printer(eventSample);
24 eventSample.OnPrintComplete();//触发事件
25}
26}
27
28 public class PrintEventArgs:EventArgs
29{
30 public string PrintState
31{
32 get;
33 set;
34}
35
36 public PrintEventArgs(string state)
37{
38 PrintState=state;
39}
40}
41
42 public class Printer
43{
44 public Printer(EventSample eventSample)
45{
46//事件订阅
47 eventSample.PrintComplete+=ShowMessage;
48 eventSample.PrintComplete+=SendSmsToMobile;
49}
50
51//在屏幕上显示信息
5 2 public void ShowMessage(object sender,PrintEventArgs e)
53{
54 Console.WriteLine(“打印已完成……”);
55 Console.WriteLine(“事件发布者发送的消息:{0}”,e.PrintState);
56}
57
58//模拟发送短消息到手机
59 public void SendSmsToMobile(object sender,PrintEventArgs e)
60{
61 Console.WriteLine(“模拟发送短消息……”);
62 Console.WriteLine(“事件发布者发送的消息:{0}”,e.PrintState);
63}
64}
65}