最近看书上有关于事件的内容,之前在写winform时,事件都是直接用的,对内部的写法并不了解。
这里将自定义一个事件。
首先,写一个类。
public class NewMailEventArgs:EventArgs//这个类以后是事件的参数,用于传递事件的一些附加信息。但是必须继承EventArgs { private readonly string m_from, m_to, m_subject; public NewMailEventArgs(string from,string to,string subject) { m_from = from; m_to = to; m_subject = subject; } public string From { get { return m_from; } } public string To { get { return m_to; } } public string Subject { get { return m_subject; } } }
再写一个类,类里面是有关事件的一些东西。
public class MailManager { public event EventHandler<NewMailEventArgs> NewMail;//定义一个事件,其实它是一个范型委托。这个委托需要两个参数。可以按F12跟到这个委托的定义
//定义一个事件的触发方法,这里为了类型安全,声明称protect protected virtual void OnNewMail(NewMailEventArgs e)//上面定义的那个类,在这里用来作为参数,传递信息 { //因为时间可能被很多地方调用,为了类型安全,这里不是直接操作NewMail事件 EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail); if (temp != null) temp(this,e); } //公开一个方法,用于把输入转化成一个期望的事件,触发事件OnNewMail public void SimulateNewMail(string from ,string to,string subject) { NewMailEventArgs e = new NewMailEventArgs(from ,to,subject); OnNewMail(e); } }
下面就是定义和触发事件了
class Program { static void Main(string[] args) { MailManager mail = new MailManager(); mail.NewMail += mail_NewMail;//创建事件 mail.SimulateNewMail("hahah","hshshs","ksksksk");//触发这个事件 mail.NewMail -= mail_NewMail;//销毁事件 } static void mail_NewMail(object sender, NewMailEventArgs e) { Console.WriteLine("Faxing mail message:"); Console.WriteLine("from={0},to={1},subject={2}", e.From, e.To, e.Subject); Console.ReadKey(); } }