当前位置: 首页 > news >正文

委托、Lambda表达式、事件系列07,使用EventHandler委托

谈到事件注册,EventHandler是最常用的。

19
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);
        }
    }

 
 
 

20  
以上,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;
            }
        }
    }    

 
 
 

21

 

总结:使用EventHandler委托不仅可以实现事件注册和取消,而且还可以获取事件发起者和事件参数。

 

 

“委托、Lambda表达式、事件系列”包括:

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托、Lambda表达式、事件系列02,什么时候该用委托

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

委托、Lambda表达式、事件系列05,Action委托与闭包

委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

委托、Lambda表达式、事件系列07,使用EventHandler委托

相关文章:

  • 推荐一款 chrome SSH 插件 - Secure Shell
  • AngularJS中有关Directive的汇总
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • 复合格式化 AppendFormat 字符
  • BZOJ 2337 XOR和路径(高斯消元)
  • Adas术语简称
  • extern c 谈
  • 转载 一堂价值39万元的课,把她看完,你一定会有所获!
  • 关于centos联网的问题
  • 第二章 Java内存区域与内存溢出异常
  • java 用进程调用外部命令并获取返回结果
  • 购物狂欢节的背后,是谁在让你在吃土?
  • Hadoop之HDFS中NameNode的工作机制
  • 目录操作常用命令
  • 史上最全的Python开发秘籍,学完这些年薪百万不是问题
  • 【知识碎片】第三方登录弹窗效果
  • 0基础学习移动端适配
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES6简单总结(搭配简单的讲解和小案例)
  • GraphQL学习过程应该是这样的
  • JDK9: 集成 Jshell 和 Maven 项目.
  • mongo索引构建
  • scala基础语法(二)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从0到1:PostCSS 插件开发最佳实践
  • 判断客户端类型,Android,iOS,PC
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • ​虚拟化系列介绍(十)
  • (+4)2.2UML建模图
  • (六)软件测试分工
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • *p++,*(p++),*++p,(*p)++区别?
  • ./configure、make、make install 命令
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • @JsonSerialize注解的使用
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [.net]官方水晶报表的使用以演示下载
  • []C/C++读取串口接收到的数据程序
  • [100天算法】-目标和(day 79)
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [C++] sqlite3_get_table 的使用
  • [c++] 自写 MyString 类
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [CISCN2019 华东南赛区]Web4
  • [COI2007] Sabor
  • [HAOI2016]食物链
  • [hdu1561] The more, The Better 【树形DP】
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [IE编程] 如何编程清除IE缓存