.NET漫游指南-009-泛型事件委托

来源:互联网 发布:易语言ce修改器源码 编辑:程序博客网 时间:2024/05/16 11:54

这篇文章主要讲述泛型事件委托。
参考网址:https://msdn.microsoft.com/en-us/library/system.eventhandler(v=vs.110).aspx#
源码地址:http://download.csdn.net/download/geshicuowu/10003963
在之前的内容中分别讲述了委托,事件,泛型。但是在项目开发中一般都是结合使用的。下面这个例子就是简要讲述这三者如何结合使用。
场景:模拟股票的行情推送,交易员订阅行情之后,行情发生变化,交易员就会收到变化的行情。
逻辑图

1:定义一个泛型的事件委托参数GenericEventArgs继承自EventArgs用于传递事件的相关数据信息。这里设置为泛型的优势是,可以在整个项目中重用该参数,降低了冗余。

    public class GenericEventArgs<T> : EventArgs    {        public GenericEventArgs(T value)        {            this.Value = value;        }        public T Value { get; set; }    }

2:定义一个数据对象StockInfor,用来作为事件信息的传递参数。

   public class StockInfor    {        double stockPrice;        public double StockPrice        {            set { stockPrice = value; }            get { return stockPrice; }        }        int stockRange;        public int StockRange        {            set { stockRange = value; }            get { return stockRange; }        }    }

3:定义一个交易员对象,用来作为订阅者。其中有个方法是GetStockInfor,用于获取事件的信息。

    class Trader    {        public string Name        {            set;            get;        }        public void GetStockInfor(object sender ,GenericEventArgs<StockInfor> e)        {            //拆箱            var stockInfor = e.Value as StockInfor;            System.Console.WriteLine(string.Format("{0} get the stock information price:{1}  range:{2} ",                                                                      Name, stockInfor.StockPrice, stockInfor.StockRange));        }    }

以上准备工作完成了,接下来就是实例化事件源和订阅者,然后对事件委托进行订阅,最后启动事件源。就会看见当股票信息发生变化时,就会通过事件委托EventHandle来告知交易员。

class Program    {        static void Main(string[] args)        {            Stock stockInfor = new Stock();            Trader Jone = new Trader();            Jone.Name = "Jone";            Trader Tom = new Trader();            Tom.Name = "Tom";            //进行事件委托            stockInfor.stockUpdate += Jone.GetStockInfor;            stockInfor.stockUpdate += Tom.GetStockInfor;            stockInfor.Start();            Console.ReadKey();        }    }

运行效果如下
运行效果