C#中利用事件来传递数据(EventArgs)

前言

大家好,我是阿辉。

前文介绍在GUI编程中的事件,其中说到EventHandler委托类型在声明时,必须有两个参数变量,第一个是object类型,第二个是EventArgs类型。

对于EventArgs类型,有2个作用。当不需要使用事件传递参数时,此变量传递null即可;当需要使用事件传递参数时,该类型当作基类使用,可传递其的子类(存储数据),用于传递数据。.

在事件中利用EventArgs传递数据

那么我们修改之前的例子,阿辉继续订阅报社的报纸,当报社发报后,阿辉可第一时间进行阅读。修改后变为报社发报的文章里面包含阿辉名称,阿辉可以直接接收这个名称数据。

修改步骤

  • 声明一个派生自EventArgs的自定义类,可保存需要传递的数据。

  • 声明委托时,使用泛型来声明,泛型的类型为EventArgs的派生类。

这里需要注意的是订阅者中执行事件处理程序的的委托参数也必须修改为派生类

派生的自定义类

    /// <summary>
    /// 派生自EventArgs的类,用于传递数据
    /// </summary>
    class PaperContentEventArgs:EventArgs
    {
        public string Name { get; set; }                    //用于存储数据,当事件被调用时,可利用其进行传递数据。
    }

报社  发布者

    /// <summary>
    /// 报社
    /// </summary>
    class NewspaperOffice 
    {
        //1、创建事件并发布
        public event EventHandler<PaperContentEventArgs> StartPublishPaper;    

        public void Publish()
        {            
            Console.WriteLine("已发布报纸!报社传递数据:阿辉");
            PaperContentEventArgs paperContent = new PaperContentEventArgs();
            paperContent.Name = "阿辉";
            
            //2、触发事件,通知订阅者收报纸进行阅读
            StartPublishPaper(this, paperContent);                                            
        }
    }

阿辉  订阅者

    /// <summary>
    /// 阿辉 订阅者
    /// </summary>
    class AhuiPeople 
    {
        public AhuiPeople(NewspaperOffice npo)
        {
            npo.StartPublishPaper += SubscriptinPaper;                    //3、订阅事件
        }

        void SubscriptinPaper(object sender, PaperContentEventArgs e)
        {            
            Console.WriteLine("阿辉接收到报纸,开始阅读!收到的传递数据为:"+e.Name);
        }
    }

输出

C#中利用事件来传递数据(EventArgs)