CodeDom系列--事件(event)定义和反射调用
CodeDom提供了对事件的支持,以及我们可以用反射机制对CodeDom生成的事件进行注册,以及调用。本节程序很简单,先贴上我将用CodeDom生成的代码:
- namespace CodeDomDemo3 { using System; public class CodeDomDemo3 { public event System.EventHandler MyEvent; protected virtual void OnHandle(System.EventArgs e) { if ((this.MyEvent != null)) { this.MyEvent(this, e); } } public void CallEvent() { this.OnHandle(EventArgs.Empty); } } }
代码很简单哦,主要是看CodeDom的事件定义机制和反射调用CodeDom编译的类型方法事件。
CodeDom代码为:
- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.CodeDom; namespace CodeDomDemo1 { public class CodeDomDemo3 { public CodeNamespace CreateCodeNamespcae() { CodeNamespace nspcae = new CodeNamespace("CodeDomDemo3"); nspcae.Imports.Add(new CodeNamespaceImport("System")); nspcae.Types.Add(CrateClassType()); return nspcae; } public CodeTypeDeclaration CrateClassType() { //field event CodeMemberEvent myevent = new CodeMemberEvent(); myevent.Attributes = MemberAttributes.Public; myevent.Type = new CodeTypeReference(typeof(EventHandler)); myevent.Name = "MyEvent"; // event method OnHandle; CodeMemberMethod method = new CodeMemberMethod(); method.Name = "OnHandle"; method.Attributes = MemberAttributes.Family; method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(EventArgs)), "e")); method.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeEventReferenceExpression(
- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.CodeDom; namespace CodeDomDemo1 { public class CodeDomDemo3 { public CodeNamespace CreateCodeNamespcae() { CodeNamespace nspcae = new CodeNamespace("CodeDomDemo3"); nspcae.Imports.Add(new CodeNamespaceImport("System")); nspcae.Types.Add(CrateClassType()); return nspcae; } public CodeTypeDeclaration CrateClassType() { //field event CodeMemberEvent myevent = new CodeMemberEvent(); myevent.Attributes = MemberAttributes.Public; myevent.Type = new CodeTypeReference(typeof(EventHandler)); myevent.Name = "MyEvent"; // event method OnHandle; CodeMemberMethod method = new CodeMemberMethod(); method.Name = "OnHandle"; method.Attributes = MemberAttributes.Family; method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(EventArgs)), "e")); method.Statements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(new CodeEventReferenceExpression(
- new CodeThisReferenceExpression(),"MyEvent"), CodeBinaryOperatorType.IdentityInequality,new CodePrimitiveExpression(null)), new CodeExpressionStatement(new CodeDelegateInvokeExpression(new CodeEventReferenceExpression(
- {new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("EventArgs"),"Empty") })); CodeTypeDeclaration myclass = new CodeTypeDeclaration("CodeDomDemo3"); myclass.Attributes = MemberAttributes.Public; myclass.Members.AddRange(new CodeTypeMember[] { myevent, method, callEvent }); return myclass; } } }
public CodeDelegateInvokeExpression( targetObject,//事件的引用 [] parameters//参数 )
2:事件的添加(+=):
public CodeAttachEventStatement( targetObject,//目标对象 string eventName,//事件名 listener//监听者 )
3:事件的移除(-=):
public CodeRemoveEventStatement( targetObject,//目标对象 string eventName,//事件名 listener//监听者 )
利用反射调用事件代码:
- 4567 Type t = result.CompiledAssembly.GetType("CodeDomDemo3.CodeDomDemo3");//获取类型 object obj= Activator.CreateInstance(t);//创建实例 t.GetEvent("MyEvent").AddEventHandler(obj, new EventHandler(pro.CallEvent));//添加事件 t.GetMethod("CallEvent").Invoke(obj, null);//触发事件
本示例代码下载:CodeDomDemo3
本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835607,如需转载请自行联系原作者
CodeDom系列--事件(event)定义和反射调用相关推荐
- 注解的定义与反射调用
2019独角兽企业重金招聘Python工程师标准>>> 一.注解的应用结构图 二.自定义注解及其应用 1.@Retention元注解 包含三种取值(枚举):RetetionPol ...
- 【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
文章目录 一.根据事件类型获取订阅者 二.调用订阅方法 一.根据事件类型获取订阅者 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收 ...
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)...
大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...
- 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步
摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...
- C#事件(event)解析
原文:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html 事件(event),这个词儿对于初学者来说,往往总是显得有些神秘 ...
- C# 委托(Delegate) 事件(Event)应用详解
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...
- C#总结(二)事件Event 介绍总结
最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...
- 事件EVENT,WaitForSingleObject(),WaitForMultipleObjecct()和SignalObjectAndWait() 的使用(上)
用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法.但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力.这时,只能考虑使 ...
- JS-图片其他事件-Event对象-事件委托-DOM对象
JS-图片其他事件-Event对象-事件委托-DOM对象 1 回顾 1. 事件回调函数中 this 的指向2. 鼠标事件click dblclick contextmenumouseenter mou ...
最新文章
- 揪出MySQL延迟上千秒的元凶
- 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
- vector拷贝复制方法
- GitHub推出包管理服务,npm与Nuget全支持
- rsync的介绍及参数详解,配置步骤,工作模式介绍
- python AES使用
- ??? Error using == Inner matrix dimensions must agree.
- CE教程:植物大战僵尸(金币数值修改)
- 典型微型计算机控制系统的实例,微型计算机控制技术
- H5(html5)入门教程
- 白城师范学院计算机系鲍金玲,企业绩效考核方法的比较与借鉴
- 30岁萌妹子当电工,在抖音做网红,在电商平台当卖家
- 记事本实现浪漫烟花、浪漫爱心、浪漫流星雨
- 从数组的响应式看下一代响应式数据
- [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins
- 网站权重8 的网站优化方案
- Android 8 WiFi断流,小米8wifi断流怎么解决
- iOS 马甲版上架流程
- USB研究(二)U盘驱动前的初始化
- 2020年是意义非凡的一年,大专的我面试阿里P6居然过了