C# event 的一个例子

using System;
class EventClass
{
    //step1:create custom event args class(skip if system:EventArgs is used)
#region custom event args class
    public class EventNameEventArgs:EventArgs
    {
        public string SenderID;
        public string EventID;
        public EventNameEventArgs(string SenderID,string EventID)
        {
            this.SenderID = SenderID;
            this.EventID = EventID;
        }
    }
#endregion custom event args class
    //step2:declare custom event delegate(skip if system:EventHandler is used)
    #region custom event delegate
    public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);
    #endregion custom event delegate
    //step3: create event declaration(EventName) and a method(OnEventName) that raises the event
        public event EventNameEventHandler EventName;    //event delegate member
        protected virtual void OnEventName(EventNameEventArgs e)   //method to invoke the event delegate member
        {
            if (EventName != null)   //if event delegate member is hooked with some function
            {
                EventName(this, e);//invoking the event delegate member and passing the event args
            }
        }
}//class EventClass

//event-raising class, derived from EventName Class, to call protected "OnEventName" method in due time
//("WHEN TO RAISE")
#region event-raising class
class EventRaisingClass:EventClass
{
    protected string EventRaiserClassID;
    public EventRaisingClass(string EventRaiserClassID)
    {
        this.EventRaiserClassID = EventRaiserClassID;
    }
    //method to raise the event while passing certain event args
    public void RaiseEvent(string EventID)
    {
        EventNameEventArgs e = new EventNameEventArgs(this.EventRaiserClassID,EventID);  //encapsulate the event parameters in the custom args
        OnEventName(e);  //raise the event
    }
}
#endregion event-raising class

//EventRecieverClass with EventProcess method
#region event-reciever class
class EventRecieverClass
{
    public EventRecieverClass(EventRaisingClass EventRaiser)
    {
        RegisterEvent(EventRaiser);
    }
    public void RegisterEvent(EventRaisingClass EventRaiser)
    {
        EventRaiser.EventName += new EventClass.EventNameEventHandler(EventProcess);  //hook EventRaiser with EventReciever
    }
    void EventProcess(object sender, EventClass.EventNameEventArgs e)
    {
        Console.WriteLine("Event {0} is raised by Sender {1} ! ",e.EventID,e.SenderID);   //事件响应函数
    }
    public void UnregisterEvent(EventRaisingClass EventRaiser)
    {
        EventRaiser.EventName -= new EventClass.EventNameEventHandler(EventProcess);
    }
}
#endregion event-reciever class
#region Application class
class App
{
    public static void Main()
    {
        //instantiate event-raising class
        EventRaisingClass EventSender1 = new EventRaisingClass("发送者1");
        EventRaisingClass EventSender2 = new EventRaisingClass("发送者2");
        //instantiate event-reciever class
        EventRecieverClass EventReviever1 = new EventRecieverClass(EventSender1);  //hooked with EventSender1 when instantiating
        EventSender1.RaiseEvent("事件1");
        EventSender1.RaiseEvent("事件2");
        EventSender2.RaiseEvent("事件3");
        EventReviever1.RegisterEvent(EventSender2);
        EventSender2.RaiseEvent("事件4");
        EventSender1.RaiseEvent("事件5");
        EventReviever1.UnregisterEvent(EventSender1);
        EventSender1.RaiseEvent("事件6");
        EventSender2.RaiseEvent("事件7");
        EventSender2.RaiseEvent("事件8");
        EventReviever1.UnregisterEvent(EventSender2);
        EventSender1.RaiseEvent("事件9");
        EventSender2.RaiseEvent("事件10");
        Console.ReadKey();
    }
}
#endregion Application class

posted on 2009-04-06 19:05  TobyLin的学习之路  阅读(508)  评论(0编辑  收藏  举报

导航