c#事件处理中事件信息EventArgs的使用和类型内部事件委托delegate的调用

时间:2022-08-30 22:45:00

事件信息EventArgs:http://msdn.microsoft.com/zh-cn/library/system.eventargs.aspx

1事件信息可以用于传递处理附带的事件数值,可以自定义事件信息类型来继承

2事件委托可以声明在事件的类型中,并可以通过【类型名.事件委托名】来调用该委托类型创建事件的处理代理

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 事件2
{
    class Program
    {
        static void Main(string[] args)
        {
            myEventer mEr = new myEventer();
            EventWatcher EWr = new EventWatcher(mEr);
            mEr.OnTrigger("浣熊市行动", 1);
        }
    }

    class myEventArgs:EventArgs//声明事件信息类型,并继承于EventArgs
    {
        public myEventArgs(string strinfo,int intinfo)
        {
            this.strinfo = strinfo;
            this.intinfo = intinfo;
        }
        private string strinfo;
        private int intinfo;
        public string StrInfo
        {
            get { return strinfo; }
        }
        public int IntInfo
        {
            get { return intinfo; }
        }
    }

    class myEventer//声明用于声明事件的类型
    {
        public delegate void myEventerHandler(object sender,myEventArgs mEa);//在类型内部声明事件代理
        public event myEventerHandler trigger;//通过事件代理声明事件event
        public void OnTrigger(string strinfo,int intinfo)//事件触发的方法,这里要传递2个参数
        {
            myEventArgs mEa = new myEventArgs(strinfo,intinfo);//以参数初始化一个新的事件信息对象
            trigger(this, mEa);
        }
    }

    class EventWatcher//事件观察和事件处理方法绑定类
    {
        private myEventer mEr;
        public EventWatcher(myEventer mer)//通过构造函数传递一个事件触发类对象,用于绑定事件处理方法
        {
            this.mEr = mer;
            mEr.trigger += new myEventer.myEventerHandler(processEvent);//虽然事件委托位于事件类型中,但仍可以通过[类型.事件委托]来访问创建
        }
        private void processEvent(object sender,myEventArgs mEa)//和事件委托相同签名的事件处理方法
        {
            Console.WriteLine("已获取事件信息,事件编号:{0},事件名称:{1}",mEa.IntInfo,mEa.StrInfo);
        }
    }
}

可以看到,该事件委托并非全局声明,但依旧可以通过

类型对象.事件+=new 类型名称.事件委托(事件处理方法名);

来进行事件的绑定~