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}