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");

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

  1. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  2. Javascript之自定义事件

    Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...

  3. MUI APP关于页面之间的传值,plusready和自定义事件

    最近在用MUI开发这个APP,发现有时候这个plusready不起作用,表现在,这个页面如果重复打开,这个plusready就进不去,然后上一个页面传过来的值,就没法接收了.这个经过MUI官方确认,是 ...

  4. 跟着《beginning jquery》学写slider插件并借助自定义事件改进它

    <beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...

  5. cocos2d-x3.x自定义事件

    -- 自定义事件 -- 监听: local eventDispatcher = self:getEventDispatcher();--self为继承Node的对象 local function ha ...

  6. HotApp小程序统计之自定义事件统计

    什么是自定义事件统计     官网:https://weixin.hotapp.cn/document 自定事件,就是自定统计任意事件的执行,灵活度最高. 用上图的云笔记说明想知道如下信息 (1)多少 ...

  7. C#:委托和自定义事件

    1. 委托概述 “委托”相当于C++中的“函数指针”,委托必须与所要“指向”的函数在“参数”和“返回类型”上保持一致; // 定义Person类 public class Person { publi ...

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

    UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...

  9. CustomEvent自定义事件

    javascript与HTML之间的交互是通过事件来实现的.事件,就是文档或浏览器窗口发生的一些特定的交互瞬间.通常大家都会认为事件是在用户与浏览器进行交互的时候触发的,其实通过javascript我 ...

  10. javascript事件之:谈谈自定义事件(转)

    http://www.cnblogs.com/pfzeng/p/4162951.html 对于JavaScript自定义事件,印象最深刻的是用jQuery在做图片懒加载的时候.给需要懒加载的图片定义一 ...

随机推荐

  1. log4j配置祥解

    第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 1 log4j.rootCategory=INFO, stdou ...

  2. Spring 报错:Error creating bean with name

    org.springframework.beans.factory.BeanCreationException: 原因是在autowire时,找不到相应的类,上述问题是因为XXXXX的实现类中没有加相 ...

  3. Linux 安全

     Linux 安全 1.安装 使系统处于单独(或隔离)的网络中.以防止未受保护的系统连接到其它网络或互联网中受到可能的攻击 安装完成后将下面软件卸载 pump                      ...

  4. typedef struct

    突然忘了这玩意儿了..今天就来搞一发 typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请n ...

  5. Dijkstra算法为什么权值不能为负

    Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U),归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记 ...

  6. solr 在windows下的安装

    安装环境 Windows 7 64bit Apache-tomcat-8.0.9-windows-x64 Solr-4.9.0 JDK 1.8.0_05 64bit 安装步骤 Tomcat和JDk的安 ...

  7. ie8下$(document).on('mouseover mouseout','ul li',function(){})的bug

    $(document).on('mouseover mouseout','ul li',function(){ if (event.type == 'mouseover') {           c ...

  8. Lucene的多域查询、结果中查询、查询结果分页、高亮查询结果和结果评分

    1.针对多个域的一次性查询 1.1.三种方案     使用lucene构造搜索引擎的时候,如果要针对多个域进行一次性查询,一般来说有三种方法:     第一种实现方法是创建多值的全包含域的文本进行索引 ...

  9. OpenGL蓝宝书第五章代码勘误以及惯性坐标系去解释模型变换:Pyramid.cpp

    假设你也发现依照教程代码完毕贴图时,你会底面的坐标和寻常顶点坐标正负相反,比方-1.0f, -1.0f, -1.0f这个顶点相应的却是世界坐标中1.0f,-1.0f,1.0f 问题到底出如今哪里? 原 ...

  10. Android Matrix详解

    Matrix的数学原理 平移变换 旋转变换 缩放变换 错切变换 对称变换 代码验证 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.An ...