自定义事件数据类和自定义事件

要在程序中使用自定义事件,必须满足如下3个条件:

  • 包含事件数据的类(即事件参数类),这个类从System.EventArgs类派生。如果事件不产生数据,则用户可以直接使用System.EventArgs类,否则用户必须定义自己的类。例如如下的代码:
自定义事件数据类
public class AlarmEventArgs : EventArgs
{
private readonly bool snoozePressed;
private readonly int nrings;

//构造函数//
public AlarmEventArgs(bool snoozePressed, int nrings)
{
this.snoozePressed = snoozePressed;
this.nrings = nrings;
}

//定义属性,私有字段nrings//
public int Nrings
{
get { return nrings; }
}

//定义属性,私有字段snoozePressed//
public bool SnoozePressed
{
get { return snoozePressed; }
}
}
  • 事件代理。同样,如果事件不产生数据,用户可以直接使用System.EventHandler,否则必须声明自己的代码类型,例如下面的代码。

(注:在.NET框架中,事件代理具有两个参数:事件源(即触发事件的对象)以及事件参数(包含与事件相关的数据)。)

public delegate void AlarmEventHandler(Object sender, AlarmEventArgs e);
  •  触发事件的类。在这个类中要包含事件声明以及触发事件的方法,例如下面的代码。

触发事件的类
//包含事件和触发事件方法的类//
public class AlarmClock
{

//声明事件,它所使用的代理类型为AlarmEventHandler//
public event AlarmEventHander Alarm;

//触发事件的方法//
protected virtual void OnAlarm(AlarmEventArgs e)
{
if (Alarm != null)
{
//通过代理调用事件处理方法//
Alarm(this, e);
}
}

}

定义好包含自定义事件的类后,就可以使用了。下面调用一个包含事件处理方法的类。

包含事件处理方法的类/
public class WakeMeUp
{
//事件处理方法,在该方法中根据用户的输入来通过事件参数sender
//设置事件发送者属性//
public void AlarmRing(Object sender, AlarmEventArgs e)
{
//访问自定义事件参数类中定义的数据
Console.WriteLine(e.AlarmString + "\n");

//通过事件参数sender来访问触发事件的对象//
((AlarmClock)sender).SnoozePressed = true;
((AlarmClock)sender).Stop
= true
//...
}
}

然后,可以在主程序中分别创建事件发送者实例和事件接收者实例,再绑定事件处理方法,最后触发事件就可以了。

代码
static void Main(string[] args)
{
//创建事件接收者对象实例//
WakeMeUp w = new WakeMeUp();

//创建事件发送者对象实例//
AlarmClock clock = new AlarmClock();

//把事件处理方法绑定到发送者的事件上//
clock.Alarm += new AlarmEventHander(w.AlarmRing);
// clock.Alarm += w.AlarmRing; //这种绑定方法也可以
clock.Start(); //触发OnAlarm方法
}

原文地址:https://www.cnblogs.com/qinlixue/p/1924837.html