1 using System; 2 3 namespace ConsoleApplication7 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 var dealer = new CarDealer(); // 这个类包含一个事件处理器,以及对其的调用方法 10 11 var michael = new Consumer("迈克尔"); // 这个类包含人名,以及一个响应事件的方法,事件参数类型是 CarInfoEventArgs 12 dealer.NewCarInfo += michael.NewCarIsHere; // 通过在事件处理器上注册(类实例包含的)响应事件方法 13 14 dealer.NewCar("法拉利"); // 执行事件处理器 15 16 var sebastian = new Consumer("瑟巴斯天"); 17 dealer.NewCarInfo += sebastian.NewCarIsHere; 18 19 dealer.NewCar("美瑟德斯"); 20 21 dealer.NewCarInfo -= michael.NewCarIsHere; 22 23 dealer.NewCar("红牛竞赛"); 24 25 Console.ReadKey(); 26 } 27 } 28 29 // 事件系统的总体思路 30 // 通过事件提醒委托(事件处理器)(第1个模型,管理参数定义和方法注册的事件委托)来激活事件响应方法(第2个模型,接收提醒和数据的方法) 31 // 两者之间应该有统一的参数约定,以此来传递数据,这个参数就是事件参数(第3个模型,包含数据的类) 32 // 它们的整体通过泛型事件处理器 EventHandler<TEventArgs> 的实例来调用,用法是 eventHandler(object sender, TEventArgs e) 33 // sender 通常是事件执行者的类,用来传递执行者的信息,e 则是事件参数,包含它自定义的数据(通常是属性) 34 // 通过在事件处理器上添加对事件响应方法的注册(取消),来关联起双方,运算符是 += / -= 35 36 public class Consumer 37 { 38 private string name; 39 40 public Consumer(string name) 41 { 42 this.name = name; 43 } 44 45 // 2 这是个事件响应方法,第二个参数决定了事件参数类型,以匹配相同参数的事件处理器 46 public void NewCarIsHere(object sender, CarInfoEventArgs e) 47 { 48 Console.WriteLine("{0}: 汽车 {1} 新到达! 事件执行者: {2}",name,e.Car,sender.ToString()); 49 } 50 } 51 52 // 3 这是个事件参数,用于连接事件处理器和事件响应方法,以传递数据 53 // 它以 Car 属性来储存数据 54 public class CarInfoEventArgs : EventArgs 55 { 56 // 该事件参数的构造函数接收 string 类型参数,并将其储存为属性 Car 57 public CarInfoEventArgs(string car) 58 { 59 this.Car = car; 60 } 61 62 public string Car { get; private set; } 63 } 64 65 public class CarDealer 66 { 67 // 1 这是个事件提醒委托,称作事件处理器,需要定义事件参数类型 68 public event EventHandler<CarInfoEventArgs> NewCarInfo; 69 70 public void NewCar(string car) 71 { 72 Console.WriteLine("汽车供应商: 新车 {0}", car); 73 74 RaiseNewCarInfo(car); 75 Console.WriteLine(); 76 } 77 78 // 这是一个普通方法,要求接收 string 类型参数 79 // 并把 string 参数传递给事件参数,然后通过具有相同事件类型的事件处理器,来执行事件 80 protected virtual void RaiseNewCarInfo(string car) 81 { 82 EventHandler<CarInfoEventArgs> newCarInfo = NewCarInfo; 83 if(newCarInfo != null) 84 { 85 newCarInfo(this, new CarInfoEventArgs(car)); 86 } 87 } 88 } 89 }
时间: 2024-10-11 14:35:10