事件参数(EventArgs)

.Net框架里边提供的一个委托EventHandler来Handle事件。

一样,搞一个场景(这个场景是书里的):买车。经销商(CarDealer)会上新车(NewCar)事件,这个事件会由买车的顾客(Comsumer)订阅,一旦有新车出来他们就会来光顾。在这里,由于需要详细的车的信息,所以使用前面提到的不带参数的方法就比较麻烦,我们重新定义一个委托(delegate)和事件参数(EventArgs)。

1、事件参数(CarInfoEventArgs)

从.Net提供的EventArgs里派生出来,包含车辆名字的属性

public class CarInfoEventArgs : EventArgs
{
public string Car { get; private set; } public CarInfoEventArgs(string car)
{
this.Car = car;
}
}

2、事件(NewCarInfo)

这里使用.Net自带的委托EventHandler来声明一个事件,相应的,这个事件的处理程序就必须使用这个委托对应的参数来构建

public event EventHandler<CarInfoEventArgs> NewCarInfo;

注意,这是一个泛型委托,在这里指定了参数的类型为CarInfoEventArgs,EventHandler的定义如下:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
where TEventArgs : EventArgs

可以看到这个委托包含两个参数:一个object类型,一个泛型参数,并且这个泛型参数被限制为EventArgs或EventArgs派生的类型

3、完整的对象

CarDealer

public class CarDealer
{
public event EventHandler<CarInfoEventArgs> NewCarInfo; // 触发事件
public void NewCar(string car)
{
Console.WriteLine($"CarDealer, new car {car}");
if (NewCarInfo != null)
{
NewCarInfo(this, new CarInfoEventArgs(car));
}
}
}

Consumer

public class Consumer
{
public string Name { get; private set; } public Consumer(string name)
{
this.Name = name;
} public void NewCarIsHere(object sender, CarInfoEventArgs e)
{
Console.WriteLine($"{name}: car {e.Car} is new");
}
}

4、具体的实现

public class Program
{
static void Main()
{
var dealer = new CarDealer(); var michael = new Consumer("Michael");
dealer.NewCarInfo += michael.NewCarIsHere; dealer.NewCar("Mercedes"); var nick = new Consumer("Nick");
dealer.NewCarInfo += nick.NewCarIsHere; dealer.NewCar("Ferrari"); dealer.NewCarInfo -= michael.NewCarIsHere;
dealer.NewCar("Toyota");
}
}
 

C#事件の.net下的EventArgs和EventHandler的更多相关文章

  1. HTML 事件属性(下)

    HTML 事件属性(下) 一:键盘事件 (Keyboard Events)二:鼠标事件 (Mouse Events) 一:键盘事件 (Keyboard Events)在下列元素中无效:base.bdo ...

  2. C# 委托和事件(二):使用.Net框架中的EventArgs和EventHandler

    前面一篇里提到事件是通过委托来进行关联的,而委托是可以带各种各样的参数的,其中就可以用事件参数(EventArgs),同时,也可以用.Net框架里边提供的一个委托EventHandler来Handle ...

  3. 事件,使用.net自带委托EventHandler

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. C#基础加强篇—委托、Lambda表达式和事件(下)

    3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...

  5. JQuery基础教程:事件(下)

     事件传播     为了说明不可单击的页面元素处理单击事件的能力,例如样式转换器中包含按钮的div元素或者兄弟元素h3,我们来实现一个鼠标指针进入元素和离开元素时的效果,首先需要添加一种翻转状态,表明 ...

  6. c# 事件为何要继承EventArgs

    1:继承EventArgs是表示该类可作为事件,删掉了就默认继承object,没人会说你错 ----就是说事件不继承EventArgs 也没有错,也能正常运用,那么继承他的意义是什么呢?看2,3. 觉 ...

  7. C#委托、事件剖析(下)

    本节对事件进行总结. 二.事件: 1.概念:Event:A member that enables an object or class to provide notifications;官方的解释是 ...

  8. a标签包着img事件 ie下 a标签的click事件失效

    整个大的背景框有个点击事件, 如果标签结构是(详细的css样式略) a{background:green;} <a href=""> <img src=" ...

  9. js基础 -----鼠标事件(按下 拖拽)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. [android] 在不同的activity之间传递数据

    新建一个activity,继承Activity 清单文件中进行配置,添加<activity/>节点 设置名称 android:name=”.类名” 点 代表的是当前包名,也可以不写 新建一 ...

  2. 5. CopyOnWriteArrayList 的适用场景

    package com.gf.demo04; import java.util.ArrayList; import java.util.Collections; import java.util.It ...

  3. js高级:event,事件冒泡,事件捕获

    1.事件 浏览器客户端上客户触发的行为都称为事件 所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发. 通过 obj.事件名=function(){} 事件名:onmouseover 鼠标悬 ...

  4. MongoDB复合索引详解

    摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能. 什么是复合索引? 复合索引,即Compound Index,指的是将多个键组合到一起创建索引,这样可以加速匹配多个键的查询.不妨通 ...

  5. 2,使用javascript

    1, <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  6. 如何通过setTimeout理解JS运行机制详解

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...

  7. 借鉴Glide思想二次封装Fresco

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近封装了个 Fresco 的组件库:DFresco,就顺便来讲讲. 背景 Fresco 图片库很强大,我们项目中就是使用的 Fre ...

  8. 花十分钟,让你变成AI产品经理

    花十分钟,让你变成AI产品经理 https://www.jianshu.com/p/eba6a1ca98a4 先说一下你阅读本文可以得到什么.你能得到AI的理论知识框架:你能学习到如何成为一个AI产品 ...

  9. Android笔试题三

    1.java堆得Young区由哪些组成: Java堆由Perm区和Heap区组成,Heap区由Old区和New区(也叫Young区)组成,New区由Eden区.From区和To区(Survivor)组 ...

  10. mysql左连接

    举个例子说明: select d.id, d.uid,d.username,d.dateline, d.message,d.replynum, c.picid, c.filename from doi ...