在上一篇随笔中,简要说明了怎样定义委托,定义事件,订阅事件,最后也实现了效果,就是当员工类的某个对象,执行某个事件时,委托事件被触发,后面也得到了结果,但是想象一下实际场景中,如果办公室有员工玩游戏了,这个时候,我们要找到是谁,在哪个位置玩游戏,而不是向所有人广播有人玩游戏了,这样并没有什么意义。因此,需要对上篇的代码进行改进,所以就要想办法传递参数,参数中需要包含必要的信息。
在本例中,关于参数,首先创建了一个参数类, CustomeEvebtArgs 且继承自EventArgs(这个我看的例子人家就是这样说的“是包含事件数据的类的基类”)
1 public class CustomeEvebtArgs:EventArgs//参数类 2 { 3 string name = "";//员工姓名 4 int number = 0;//所在办公室编号 5 public CustomeEvebtArgs() 6 { 7 } 8 public string Name 9 { 10 get { return this.name; } 11 set { this.name = value; } 12 } 13 public int Number 14 { 15 get { return this.number; } 16 set { this.number = value; } 17 } 18 }
用这个参数类的对象去保存相关信息。而此时此刻,员工类就应当对应有姓名和座位号了,代码同上。
1 // 定义一个委托(打小报告的狐狸) 2 /// </summary> 3 /// <param name="sender">触发事件的源</param> 4 /// <param name="e">触发时间所携带的参数</param> 5 public delegate void DelegateClassHandle(object sender,CustomeEvebtArgs e);
此时,委托事件函数就应当带有定义委托时的上述两个参数了
PlayGame(this,e) ;
这个时候 this 代表的是该实例,也就是触发委托事件的实例。e则是该实例中的参数信息,其中e的初始化如下:
CustomeEvebtArgs e = new CustomeEvebtArgs(); e.Name = _name; e.Number = _number;
只要定义员工对象初始化后,被初始化的信息就作为参数被传递
public void Notify(object sender,CustomeEvebtArgs e) { Console.WriteLine("报告老板,{0}在{1}玩游戏哦",e.Name,((Employee)sender).Number); }
注意:处理事件的函数其函数前面一定要和委托定义时相同,如上所示。而上面的参数也可以用多种方式,既可以用参数类对象的属性表示,也可以用触发事件的实例的属性表示。
当然事件被触发后,也可以被多个函数处理,比如添加一个“罚工资”的函数
static void penalty(object sender, CustomeEvebtArgs e)
{
Console.WriteLine("罚款100");
}
这样只需我的委托函数关联上该函数即可
e.PlayGame += new DelegateClassHandle(penalty); 这里我没有重新创建一个类,而是直接将该函数作为静态函数,让委托直接调用函数名,而在定义该函数时不要忘了和定义委托时要有同样的参数