using System;
//第一步 定义事件参数类型
internal class NewMailEventArgs:EventArgs
{
private readonly string m_from,m_to,m_subject;
public NewMailEventArgs(string from,string to,string subject)
{
this.m_from = from;
this.m_to = to;
this.m_subject = subject;
}
public string From
{
get {return this.m_from;}
}
public string To
{
get {return this.m_to;}
}
public string Subject
{
get {return this.m_subject;}
}
}
internal class MailManager
{
//第二步定义事件成员
//public delegate void EventHandle<TEventArgs>
// (Object sender,TEventArgs e) Where TEventArgs:EventArgs;
public event EventHandler<NewMailEventArgs> NewMail;
//第三步定义一虚方法引发事件,如果类型为sealed,方法应定义为private 和 非虚方法。
protected virtual void OnNewMail(NewMailEventArgs e)
{
//出于线程安全,使用临时字段
EventHandler<NewMailEventArgs> temp = NewMail;
if (temp != null)
temp(this,e);
}
//第四定义一个方法将输入转化为期望的事件
public void SimulateNewMail(string from,string to,string subject)
{
NewMailEventArgs e = new NewMailEventArgs(from,to,subject);
this.OnNewMail(e);
}
}
//事件测试
internal sealed class Fax
{
public Fax(MailManager mm)
{
mm.NewMail += FaxMsg;
}
private void FaxMsg(Object sender,NewMailEventArgs e)
{
Console.WriteLine("Faxing mail message:");
Console.WriteLine("From = {0},To = {1},Subject = {2}",e.From,e.To,e.Subject);
}
public void Unregister(MailManager mm)
{
mm.NewMail -= FaxMsg;
}
}