如何实现自定义事件

1.对于事件,熟悉observer模式的朋友应该很容易理解。实际上,使用事件所起到的作用也是类似的,是为了让应用程序中的一个或多个对象,能够以回调的方式,接收关于某个事件的通知。

 

2.实现一个自定义事件

(1) 监听对象的设计

作为监听对象listener,一定要实现一个特定的函数如下:

public void _Func(Object sender, MailEventArgs e);

其中,_Func并不是固定的,有点类似于C中对于函数指针的要求,只要求返回值和参数是一样的。

 

(2)写一个统一的处理模块,在其中加入事件委托对象

public event EventHandler<EventArgs> AllEventType;

需要注意的是,<>中也可以填入EventArgs的派生类的类型,这个派生类可以放置一些额外信息,供事件发生时使用。

 

(3)创建监听对象的同时,将监听对象的回调方法注册到事件委托对象中

AllEventType += listener._Func

 

(4)事件发生时,通知所有监听者(通过调用已注册回调方法的方式)

AllEventType (this, e);  //这里的e即EventArgs或其派生类的实例

 

3.示例代码

class Fax
    {
        public Fax(int id)
        {
            m_id = id;
        }

        private int m_id = 0;
        public void Msg(Object sender, MailEventArgs e)
        {
            Console.WriteLine("Fax {0} called, from {1}, to {2}", this.m_id, e.From, e.To);
        }
    }

    internal class MailEventArgs : EventArgs
    {
        public MailEventArgs(string from, string to)
        {
            From = from;
            To = to;
        }

        //其实应该用accessor,懒了
        public string From;
        public string To;
    }

    class MailManager
    {
        public void NewMail(MailEventArgs arg)
        {
            AllMailType(this, arg);
        }

        public event EventHandler<MailEventArgs> AllMailType;
    }

    class Program
    {
        static void Main(string[] args)
        {
            MailManager mam = new MailManager();
            Fax a = new Fax(1);

            //多次注册,因此可以在事件发生时,发现调用了多次回调
            mam.AllMailType += a.Msg;
            mam.AllMailType += a.Msg;
            mam.AllMailType += a.Msg;
            mam.AllMailType += a.Msg;

            //事件发生了
            mam.NewMail(new MailEventArgs("Shanghai", "Beijing"));

        }
    }

 

4.

参考自 CLR via C#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值