C#事件之 发布符合 .NET Framework 准则的事件

下面的过程演示了如何将符合标准 .NET Framework 模式的事件添加到您的类和结构中。NET Framework 类库中的所有事件均基于 EventHandler 委托

public delegate void EventHandler(object sender, EventArgs e);
 

采用 EventHandler 模式发布事件

  1. (如果不需要与事件一起发送自定义数据,请跳过此步骤,进入步骤 3a。)在发行者类和订阅方类均可看见的范围中声明自定义数据的类。 然后添加保留您的自定义事件数据所需的成员。 在此示例中,会返回一个简单字符串。

    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            msg = s;
        }
        private string msg;
        public string Message
        {
            get { return msg; }
        } 
    }
    
  2. (如果您使用的是 EventHandler<TEventArgs> 的泛型版本,请跳过此步骤。)在发布类中声明一个委托。为它指定以 EventHandler 结尾的名称。 第二个参数指定自定义 EventArgs 类型。

    public delegate void CustomEventHandler(object sender, CustomEventArgs a);
    
  3. 使用以下任一步骤,在发布类中声明事件。

    1. 如果没有自定义 EventArgs 类,事件类型就是非泛型 EventHandler 委托。 无需声明委托,因为它已在创建 C# 项目时包含的 System 命名空间中进行了声明。 将以下代码添加到发行者类中。

      public event EventHandler RaiseCustomEvent;
      
    2. 如果使用的是 EventHandler 的非泛型版本,并且您有一个由 EventArgs 派生的自定义类,请在发布类中声明您的事件,并且将来自步骤 2 的委托用作类型。

      public event CustomEventHandler RaiseCustomEvent;
      
      
    3. 如果使用的是泛型版本,则不需要自定义委托。 相反,在发行者类中,您应将事件类型指定为 EventHandler<CustomEventArgs>,将尖括号中的内容替换为自己的类的名称。

      public event EventHandler<CustomEventArgs> RaiseCustomEvent;

namespace DotNetEvents
{
    using System;
    using System.Collections.Generic;
    public class CustomEventArgs : EventArgs//定义继承自EventArgs类的
    {
        public CustomEventArgs(string s)
        {
            message = s;
        }
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }
    class Publisher//定义发布事件的类
    {
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;

        public void DoSomething()
        {//在这里可以添加事件,或者写一些有用的代码
            OnRaiseCustomEvent(new CustomEventArgs("Did something"));

        }
        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
            if (handler != null)
            {
                e.Message += String.Format(" at {0}", DateTime.Now.ToString());
                handler(this, e);
            }
        }
    }
    class Subscriber//订阅事件的类
    {
        private string id;
        public Subscriber(string ID, Publisher pub)
        {
            id = ID;
            pub.RaiseCustomEvent += HandleCustomEvent;//使用c#2.0的语法,订阅事件
        }
        void HandleCustomEvent(object sender, CustomEventArgs e)//定义事件触发的方法
        {
            Console.WriteLine(id + " received this message: {0}", e.Message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();//发布者
            Subscriber sub1 = new Subscriber("sub1", pub);//订阅者1
            Subscriber sub2 = new Subscriber("sub2", pub);//订阅者2
            pub.DoSomething();//告诉方法触发事件
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值