委托、Lambda表达式、事件系列07,使用EventHandler委托
谈到事件注册,EventHandler是最常用的。

EventHandler是一个委托,接收2个形参。sender是指事件的发起者,e代表事件参数。
□ 使用EventHandler实现猜拳游戏
使用EventHandler实现一个猜拳游戏,每次出拳,出剪刀、石头、布这三者的其中一种。
首先抽象出一个被观察者,其中提供了事件,提供了执行事件的方法。
public class FistGame{public string FistName { get; set; }public event EventHandler GuessFist;public void Start(){if (GuessFist != null){GuessFist(this, EventArgs.Empty);}}}
以上,在Start方法内部调用事件GuessFist的时候,实参this代表FistGame类本身。
客户端必须有一个方法和EventHandler的定义保持一致,这样才可以注册到FistGame类的EventHandler事件上。
class Program{static void Main(string[] args){FistGame jiandao = new FistGame(){FistName = "剪刀"};jiandao.GuessFist += GetFistResult;FistGame shitou = new FistGame() { FistName = "石头" };shitou.GuessFist += GetFistResult;FistGame bu = new FistGame() { FistName = "布" };bu.GuessFist += GetFistResult;FistGame finalFist = null;var temp = new Random().Next()%3;if (temp == 0){finalFist = jiandao;}else if(temp == 1){finalFist = shitou;}else{finalFist = bu;}finalFist.Start();}static void GetFistResult(object sender, EventArgs e){FistGame fistGame = sender as FistGame;Console.WriteLine("本次出的拳为:" + fistGame.FistName);}}
以上,GetFistResult方法的参数列表符合EventHandler的定义,并且给每个FistGame实例的GuessFist事件注册了该方法。最后,根据随机数来决定采用哪个FistGame实例。
□ 使用EventHandler传递事件参数
首先需要一个派生于EventArgs的类,通过构造函数注入一个枚举状态。
public class FistGameEventArgs : EventArgs{public FistEnum CurrentFist { get; private set; }public FistGameEventArgs(FistEnum currentFist){CurrentFist = currentFist;}}public enum FistEnum{jiandao,shitou,bu}
作为被观察者的FistGame来讲,现在需要EventHandler<TEventArgs>泛型来实现。
public class FistGame{public string FistName { get; set; }public event EventHandler<FistGameEventArgs> GuessFist;public void Start(){if (GuessFist != null){GuessFist(this, new FistGameEventArgs(FistEnum.jiandao));}}}
客户端,与EventHandler参数列表一致的GetFistResult方法把事件参数显示出来。
static void Main(string[] args){FistGame jiandao = new FistGame(){FistName = "剪刀"};jiandao.GuessFist += GetFistResult;jiandao.Start();}static void GetFistResult(object sender, FistGameEventArgs e){FistGame fistGame = sender as FistGame;Console.WriteLine("从Name属性获得,本次出的拳为:" + fistGame.FistName);switch (e.CurrentFist){case FistEnum.jiandao:Console.WriteLine("从事件参数获得,本次出的拳为:剪刀");break;case FistEnum.shitou:Console.WriteLine("从事件参数获得,本次出的拳为:石头");break;case FistEnum.bu:Console.WriteLine("从事件参数获得,本次出的拳为:布");break;}}}

总结:使用EventHandler委托不仅可以实现事件注册和取消,而且还可以获取事件发起者和事件参数。
“委托、Lambda表达式、事件系列”包括:
委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
委托、Lambda表达式、事件系列02,什么时候该用委托
委托、Lambda表达式、事件系列03,从委托到Lamda表达式
委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理
委托、Lambda表达式、事件系列05,Action委托与闭包
委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
委托、Lambda表达式、事件系列07,使用EventHandler委托
委托、Lambda表达式、事件系列07,使用EventHandler委托的更多相关文章
- 委托/lambda表达式/事件
委托 委托是执行安全的类,它的使用方式与类类似(即都需要定义再实例化),不同在于,类在实例化之后叫对象或类的实例,但委托在实例化后仍叫委托,委托可以把函数作为参数传递. 语法声明: delegate ...
- 委托+内置委托方法+多播委托+lambda表达式+事件
委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...
- 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】
1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...
- Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- (28)C#委托,匿名函数,lambda表达式,事件
一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...
- C#编程 委托 Lambda表达式和事件
委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方 ...
- C#学习笔记三(委托·lambda表达式和事件,字符串和正则表达式,集合,特殊的集合)
委托和事件的区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进行调用 是 否 3 是否是一个类型 是 否,事件修饰的是一个对象 public delegate vo ...
- 委托 lambda表达式浅显理解
方法不能跟变量一样当参数传递,怎么办,C#定义了委托,就可以把方法当变量一样传递了,为了简单,匿名方法传递,省得再声明方法了:再简单,lambda表达式传递,比匿名方法更直观. public dele ...
随机推荐
- python enumerate用法总结【转】
enumerate()说明 enumerate()是python的内置函数 enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enum ...
- 重温CSS之文档结构
我们来看看几个基本的HTML页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- Python黑魔法
1. 赋值 In [1]: x = 1 ...: y = 21 ...: print x, y ...: ...: x, y = y, x ...: print x, y 1 21 21 1 2. 列 ...
- express中间件代理实现跨域
前端代码 var xhr = new XMLHttpRequest(); xhr.open('post', 'http://localhost:3000', true); xhr.onreadysta ...
- 标签流 VS 脚本流
搞过点前端,玩过几个框架之后,基本都会发现框架在设计上的一些套路和流派,今天给大家扒一扒其中的两个书写流派“标签流”和“脚本流” 我们以一个button按钮为例: 这样裸写HTML标签的方式基本没法儿 ...
- CentOS 7安装图形化界面后重启出现Initial setup of CentOS Linux 7 (core)
这是CentOS内核的初始设置页面,下面给出中文解释及操作方法. 1.CentOS Linux 7 初始设置(核心) 1)[!]许可证信息 (没有接受许可证) 请您选择[‘1’ 输入许可证信息 | ‘ ...
- Yeoman generator
使用Yeoman generator来规范工程的初始化 前言 随着开发团队不断发展壮大,在人员增加的同时也带来了协作成本的增加:业务项目越来越多,类型也各不相同.常见的类型有基础组件.业务组件.基于R ...
- CSS------Filter属性的使用方法
转载: http://www.w3cplus.com/css3/ten-effects-with-css3-filter
- 关于 win10 创建WiFi热点 问题(无法启动承载网络 , 我们无法设置移动热点,因为你的电脑未建立以太网,wifi或手机网络数据连接 )
电脑创建WiFi,一般三种办法: 1. WiFi共享软件:猎豹wifi.wifi共享精灵.wifi共享大师..... 2. 命令提示符 netsh wlan set hostednetwork mod ...
- chown 详解
chown Linux/Unix 是多用户多任务操作系统,所有的文件皆有其拥有者(Owner).利用 chown命令 可以将文件的拥有者加以改变.一般来说,这个命令只能由系统管理者(root)使用,一 ...