欢迎来到陆季疵的博客

人生莫作远行客,远行莫戍黄沙碛。黄沙碛下八月时, 霜风裂肤百草衰。尘沙晴天迷道路,河水悠悠向东去。 胡笳听彻双泪流,羁魂惨惨生边愁。原头猎火夜相向, 马蹄蹴蹋层冰上。不似京华侠少年,清歌妙舞落花前。

.NET自定义事件

自定义事件

/* 1、事件是基于委托的,事件需要使用委托类型来约束,这个约束规定了事件可以发送什么样的消息给事件的响应者,也规定了事件的响应者能收到什么样的消息
* 事件响应者的处理器必须可以和这个约束匹配,才能订阅这个事件。
* 2、当事件的响应者向事件的拥有者提供了可以和这个事件匹配的事件处理器的时候需要有个地方把这个事件保存和记录,
* 能够记录事件的方法只有委托类型的实例可以做到
*/

1、首先定义需要传递的消息类型,继承自EventArgs

    /// <summary>
    /// 需要传递的消息类型,平台规定该类自动派生自EventArgs
    /// </summary>
    public class OrderEventArgs : EventArgs
    {
        public string DishName { get; set; }
        public string Size { get; set; }
    }

2、创建一个类为事件的拥有者,声明事件

  2.1事件的完整声明方式如下

        #region 事件声明的完整格式
        //委托类型的字段,存储或者引用事件处理器
        private OrderEventHander orderEbentHander;

        //声明事件
        public event OrderEventHander Order
        {
            add{this.orderEbentHander += value;}
            remove{this.orderEbentHander -= value; }
        }
        #endregion

  2.2事件的简略声明格式

        //事件声明的简略格式 
        public event OrderEventHander Order_2;
        //可以用.net平台定义的EventHandler代替
        public event EventHandler Order_2;

事件的拥有者示例如下:

    /// <summary>
    /// 事件的拥有者
    /// </summary>
    public class Customer
    {
        //可以用.net平台定义的EventHandler代替
        public event EventHandler orderEbentHander;

        public double Bill { get; set; }

       void Think()
        {
            //思考5秒钟
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Let me think......");
                System.Threading.Thread.Sleep(1000);
            }
            this.OnOrder("Kongpao Chicken", "large");
        }
        //触发事件的方法
        protected void OnOrder(string dishName, string size)
        {
            //简略格式的触发
            if (this.orderEbentHander != null)
            {
                OrderEventArgs e = new OrderEventArgs()
                {
                    DishName = dishName,
                    Size = size
                };
                //执行委托
                this.orderEbentHander.Invoke(this, e);
            }
        }
        public void Action()
        {
            Console.ReadLine();
            Console.WriteLine("Walk into the restaurant");//走进餐馆 void Walkin()
            Console.WriteLine("Sit down");//坐下 void SitDown()
            this.Think();
            Console.WriteLine("I will pay ${0}", this.Bill);//支付   void PayTheBill()
            Console.ReadLine();
        }

    }

3、事件的响应者订阅事件==事件处理器订阅事件

    /// <summary>
    /// 事件的响应者
    /// </summary>
    public class Waiter
    {
        //订阅事件==事件处理器订阅事件
        public void Action(Customer customer, OrderEventArgs e)
        {
            Console.WriteLine("I will serve you the dish-{0}", e.DishName);
            double price = 10;
            switch (e.Size)
            {
                case "small":
                    price *= 0.5;
                    break;
                case "large":
                    price *= 1.5;
                    break;
                default:
                    break;
            }
            customer.Bill += price;
        }

        //使用平台默认的委托事件
        public void Action(object sender, EventArgs ee)
        {
            Customer customer = sender as Customer;
            OrderEventArgs e = ee as OrderEventArgs;
            Console.WriteLine("I will serve you the dish-{0}", e.DishName);
            double price = 10;
            switch (e.Size)
            {
                case "small":
                    price *= 0.5;
                    break;
                case "large":
                    price *= 1.5;
                    break;
                default:
                    break;
            }
            customer.Bill += price;
        }
    }

调用方法

        static void Main(string[] args)
        {
            Customer customer = new Customer();//顾客
            Waiter waiter = new Waiter();//服务员
            customer.orderEbentHander += waiter.Action;//订阅事件
            customer.Action();//触发事件
            Console.Read();
        }

输出结果

 

posted @ 2021-11-28 23:02  陆季疵  阅读(111)  评论(0编辑  收藏  举报
//《!--看板娘--> //https://www.cnblogs.com/ZTianming/p/14618913.html