C#自定义事件的写法
C#事件基于委托
例1:只用于学习,理解事件底层原理,不推荐这么写;
例2:系统用的就是该方式,例如按钮的Click事件;
例3:最简略的写法,但是需要客户代码转换EventArgs;
1、事件声明完整格式范例:
1 //自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类 2 public class MyEventArgs : EventArgs 3 { 4 public int ID { get; set; } 5 public string Name { get; set; } 6 } 7 //声明委托类型 8 public delegate void MyEventHandler(object sender, MyEventArgs e); 9 public class MyClass 10 { 11 //声明委托字段 12 private MyEventHandler myEventHandler; 13 //定义事件 14 public event MyEventHandler MyEvent 15 { 16 add 17 { 18 myEventHandler += value; 19 } 20 remove 21 { 22 myEventHandler -= value; 23 } 24 } 25 public void Action() 26 { 27 28 OnOrder(1, "jack"); 29 } 30 //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发 31 private void OnOrder(int id, string name) 32 { 33 if (myEventHandler != null) 34 { 35 MyEventArgs e = new MyEventArgs 36 { 37 ID = id, 38 Name = name 39 }; 40 //触发事件 41 myEventHandler.Invoke(this, e); 42 } 43 } 44 }
2、事件声明简化格式范例:
1 //事件参数,默认以EventArgs结尾,需要继承EventArgs类 2 public class MyEventArgs : EventArgs 3 { 4 public int ID { get; set; } 5 public string Name { get; set; } 6 } 7 //声明委托类型 8 public delegate void MyEventHandler(object sender, MyEventArgs e); 9 public class MyClass 10 { 11 //定义事件 12 public event MyEventHandler MyEvent; 13 public void Action() 14 { 15 OnOrder(1, "jack"); 16 } 17 //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发 18 private void OnOrder(int id, string name) 19 { 20 if (MyEvent != null) 21 { 22 MyEventArgs e = new MyEventArgs 23 { 24 ID = id, 25 Name = name 26 }; 27 //触发事件 28 MyEvent.Invoke(this, e); 29 } 30 } 31 }
3、事件声明通常不需要自定义委托类型,一般使用系统自带的EventHandler 类型:
1 //事件参数,默认以EventArgs结尾,需要继承EventArgs类 2 public class OrderEventArgs : EventArgs 3 { 4 public int ID { get; set; } 5 public string Name { get; set; } 6 } 7 public class MyClass 8 { 9 //定义事件 10 public event EventHandler MyEvent; 11 public void Action() 12 { 13 14 OnOrder(1, "jack"); 15 } 16 //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发 17 private void OnOrder(int id, string name) 18 { 19 if (MyEvent != null) 20 { 21 OrderEventArgs e = new OrderEventArgs 22 { 23 ID = id, 24 Name = name 25 }; 26 //触发事件 27 MyEvent.Invoke(this, e); 28 } 29 } 30 }