CodeDom提供了对事件的支持,以及我们可以用反射机制对CodeDom生成的事件进行注册,以及调用。本节程序很简单,先贴上我将用CodeDom生成的代码:

  1. 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代码为:

  1. 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(
  1. 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(
  1. new CodeThisReferenceExpression(),"MyEvent"), CodeBinaryOperatorType.IdentityInequality,new CodePrimitiveExpression(null)), new CodeExpressionStatement(new CodeDelegateInvokeExpression(new CodeEventReferenceExpression(
  1. {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//监听者
)

利用反射调用事件代码:

  1. 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)定义和反射调用相关推荐

  1. 注解的定义与反射调用

    2019独角兽企业重金招聘Python工程师标准>>> 一.注解的应用结构图 二.自定义注解及其应用 1.@Retention元注解   包含三种取值(枚举):RetetionPol ...

  2. 【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )

    文章目录 一.根据事件类型获取订阅者 二.调用订阅方法 一.根据事件类型获取订阅者 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收 ...

  3. .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)...

    大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...

  4. 事件Event:带你体验鸿蒙轻内核中一对多、多对多任务同步

    摘要:本文通过分析鸿蒙轻内核事件模块的源码,深入掌握事件的使用. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十二 事件Event>,原文作者:zhushy . 事件(Event)是一 ...

  5. C#事件(event)解析

    原文:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html 事件(event),这个词儿对于初学者来说,往往总是显得有些神秘 ...

  6. C# 委托(Delegate) 事件(Event)应用详解

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每 ...

  7. C#总结(二)事件Event 介绍总结

    最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...

  8. 事件EVENT,WaitForSingleObject(),WaitForMultipleObjecct()和SignalObjectAndWait() 的使用(上)

    用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法.但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力.这时,只能考虑使 ...

  9. JS-图片其他事件-Event对象-事件委托-DOM对象

    JS-图片其他事件-Event对象-事件委托-DOM对象 1 回顾 1. 事件回调函数中 this 的指向2. 鼠标事件click dblclick contextmenumouseenter mou ...

最新文章

  1. 揪出MySQL延迟上千秒的元凶
  2. 基于Spring cloud Ribbon和Eureka实现客户端负载均衡
  3. vector拷贝复制方法
  4. GitHub推出包管理服务,npm与Nuget全支持
  5. rsync的介绍及参数详解,配置步骤,工作模式介绍
  6. python AES使用
  7. ??? Error using == Inner matrix dimensions must agree.
  8. CE教程:植物大战僵尸(金币数值修改)
  9. 典型微型计算机控制系统的实例,微型计算机控制技术
  10. H5(html5)入门教程
  11. 白城师范学院计算机系鲍金玲,企业绩效考核方法的比较与借鉴
  12. 30岁萌妹子当电工,在抖音做网红,在电商平台当卖家
  13. 记事本实现浪漫烟花、浪漫爱心、浪漫流星雨
  14. 从数组的响应式看下一代响应式数据
  15. [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins
  16. 网站权重8 的网站优化方案
  17. Android 8 WiFi断流,小米8wifi断流怎么解决
  18. iOS 马甲版上架流程
  19. USB研究(二)U盘驱动前的初始化
  20. 2020年是意义非凡的一年,大专的我面试阿里P6居然过了

热门文章

  1. .net String Formatter 格式转换
  2. 2016年中国微信小程序专题研究报告
  3. PostgresSQL数据类型
  4. 在线计算一周的开始结束时间
  5. 决定薪资高低的到底什么?
  6. 常用的组播保留地址列表
  7. 自定义SharePoint Webservice
  8. python精度_通过Python可以达到的最高时间精度范围是多少?
  9. c++ protected_java基础之——访问修饰符(private/default/protected/public)
  10. 【论文写作】2021毕业论文写作选题技巧,建议收藏!