使用C#的自定义事件

  

        public class CarDealer
        {
            public Action<string> NewCarInfo;   //使用系统定义的泛型委托

            public void NewCarComing(string car)
            {
                Console.WriteLine("CarDealer, new car {0} has come.", car);

                if (NewCarInfo != null)
                    NewCarInfo(car);
            }
        }

  先插入一段代码,这个例子的 Action<string> 表示只有一个 string 参数,如果有一组的参数的话,代码写起来会比较难看。

  .Net 给我们提供了基于 EventArgs 来进行传参 的 自定义事件 EventHandler。

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

  可以 EventHandler 理解为“发布者提供的订阅器”"sender" 表示发布者“e” 表示发布者推送给订阅者的参数信息

  而 EventArgs 则是 发布者 与 订阅者 间约定好的订阅信息

  来看完整的例子:

    class Program
    {
        public class MyEventArg : EventArgs
        {
            public string name { get; set; }

            public MyEventArg(string carname)
            {
                name = carname;
            }
        }

        public class CarDealer
        {
            public event EventHandler<MyEventArg> NewCarInfo;   

            public void NewCarComing(string carname)
            {
                Console.WriteLine("CarDealer, new car {0} has come.", carname);

                if (NewCarInfo != null)
                    NewCarInfo(this, new MyEventArg(carname));
            }
        }

        public class Consumer
        {
            private string name;

            public Consumer(string name)
            {
                this.name = name;
            }

            public void NewCarIsHere(object sender, MyEventArg e)
            {
                Console.WriteLine("{0}, car {1} is new", name, e.name);
            }
        }

        static void Main(string[] args)
        {
            var dealer = new CarDealer();
            var personA = new Consumer("personA");
            dealer.NewCarInfo += personA.NewCarIsHere;
            dealer.NewCarComing("Ferrari");

            var personB = new Consumer("personB");
            dealer.NewCarInfo += personB.NewCarIsHere;
            dealer.NewCarComing("BMW");

            Console.ReadLine();
        }
    }

  

  个人不喜用“发布-订阅”模式来阐述,更偏向于用“通知-反馈”模式的流程 可加以总结了:

1. 定义一种事件或委托,同时约定好通知者要给反馈者的参数;

        public class MyEventArg : EventArgs
        {
            public string name { get; set; }

            public MyEventArg(string carname)
            {
                name = carname;
            }
        }

        public class CarDealer
        {
            public event EventHandler<MyEventArg> NewCarInfo;   

            public void NewCarComing(string carname)
            {
                Console.WriteLine("CarDealer, new car {0} has come.", carname);

                if (NewCarInfo != null)
                    NewCarInfo(this, new MyEventArg(carname));
            }
        }

2. 发布者提供事件通道 接受 反馈者按约定生成的反馈行为;

        public class Consumer
        {
            private string name;

            public Consumer(string name)
            {
                this.name = name;
            }

            public void NewCarIsHere(object sender, MyEventArg e)
            {
                Console.WriteLine("{0}, car {1} is new", name, e.name);
            }
        }
            var dealer = new CarDealer();
            var personA = new Consumer("personA");
            dealer.NewCarInfo += personA.NewCarIsHere;
            var personB = new Consumer("personB");
            dealer.NewCarInfo += personB.NewCarIsHere;

3. 通知者发出通知,反馈者收到通知并做出反馈行为;

dealer.NewCarComing("Ferrari");
dealer.NewCarComing("BMW");
时间: 2024-12-08 10:03:55

使用C#的自定义事件的相关文章

【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】

UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http://www.cnblogs.com/denghejun/p/3671061.html 我的理解: Usercontrol应该是一个带有功能,带有行为的控件.而一些简单的模型,样式效果,应该都可以用Template实现.它大部分是给呈现效果服务,当然,它可以带有很多事件触发器. 另外,在一些复杂的功

jQuery的自定义事件——滚轮

这个案例类似于在地图上滚动滚轮,能缩小或者放大地图,分别用zoomIn和zoomOut来命名. 代码如下: //JS部分:<script src="jquery-1.10.2.min.js"></script> <script type="text/javascript"> $(function(){ $('img').on('zoomIn', function(){ $(this).css('width', 300) }); $

js中事件(自定义事件)

今天闲的蛋疼,我们来聊一聊web前端中的事件机制和自定义事件.灵感来自jQuery,在此感谢jQuery作者. 首先,最开始. <button id="button" type="button" onclick="alert('hello')">你好</button> 这是我们在使用html写页面的时候最原生的事件触发方式.上面那行代码会生成一个按钮,当我们点击这个按钮的时候就会弹出一个原生的弹窗,内容是hello. 随着

js原生创建模拟事件和自定义事件的方法

让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 1. 模拟鼠标事件 MDN上已经说得很清楚,尽管为了保持向后兼容MouseEvent.initMouseEvent()仍然可用,但是呢,我们应该使用MouseEvent().我们使用如下页面做测试 1 <!DOCTYPE html> 2 <html> 3 <head lang="zh-CN"> 4

javascript和jquey的自定义事件小结

“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用对象B的某个方法,实现交互:直接方法调用本质上也是属于一种特殊的发送与接受消息,它把发送消息和接收消息合并为一个动作完成: 方法调用方和被调用方被紧密耦合在一起:因为发送消息和接收消息是在一个动作内完成,所以无法做到消息的异步发送和接收: 2)对象A生成消息->将消息通知给一个事件消息处理器(Obs

js高级技巧----自定义事件

自定义事件 原本的事件处理的原理:事件是javascript与浏览器交互的主要途径. 事件是一种叫做观察者的设计模式 观察者模式由两类对象组成:主体和观察者. 主体用于发布事件: 观察者通过订阅这些事件来观察该主体. 自定义事件的原理: 将事件处理程序保存在一个数组中: 当添加事件的时候,我们push进去这个事件处理函数: 当我们执行的时候,从头遍历这个数组中的每个事件处理函数,并执行. 自定义事件应该具有的内容: 1.一个handler对象,对象中保存着存放事件处理函数的数组 handler 

PB中自定义事件ID含义

PB中自定义事件ID含义 单选或多选按钮消息(前缀:pbm_bm) pbm_bmgetcheck 单选按钮或多选按钮是否被选. pbm_bmgetstate 按钮是否加亮. pbm_bmsetcheck 将无线按钮或确认框的选中状态改为未选中状态,反之亦然. pbm_bmsetstate 加亮或不加亮按钮. pbm_bmchange 改变按钮的风格,例如,改为单选按钮或组合框. 单选或多选按钮通知消息(前缀:pbm_bn) pbm_bnclicked 按钮控件被点中. pbm_bndisable

浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在html的脚本中使用自己在.net中定义的类,实现与Internet Explorer server的互操作.此外也可以在充分利用html在设计界面方面高效,简单的同时,也可以实现一些复杂的特性. 实现: Code Code highlighting produced by Actipro CodeH

C#自定义事件模拟风吹草摇摆

这是一个自定义事件的例子.C#.WinForm.Visual Studio 2017.在HoverTreeForm中画一块草地,上面有许多草(模拟).HewenqiTianyi类模拟天气,会引发“风”事件(HoverTreeWindEvent),风有东风或西风,或静止.当吹东风,草往西边倒,吹西风则往东边到.静止则草不会东歪西倒.草地上每一颗草都监听HoverTreeWindEvent事件,根据风向(WindDdirection)调整姿态.HewenqiTianyi中有定时器,每隔一段时间触发调

自定义事件解决重复请求BUG

现在,组件化开发还是比较流行的,毕竟其优点相当突出.最近在开发一个组件的时候,遇到了一个很有意思的BUG... BUG的背景 最近在开发一个组件,好不容易开发好了转测试.然后,测试给我提了一个这样的bug,orz... 因为是一个组件,最大的好处就是可以随处复用,随处使用,然而,当一个页面用了多个组件,只有最后一个生效的时候,这个组件就没有什么意义了... BUG原因查找 这个组件的初始数据来源的接口是固定的,也就是说,页面内的所有这个组件在初始化的时候都会发出同样的请求,这里的请求是jsonp