CodeDom系列--事件(event)定义和反射调用

简介:

  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,如需转载请自行联系原作者


相关文章
Revit空闲事件(Idling Event)增强和外部事件(External Event)
Revit空闲事件(Idling Event)增强和外部事件(External Event)
Revit空闲事件(Idling Event)增强和外部事件(External Event)
|
小程序
小程序--event对象
小程序--event对象
436 0
小程序--event对象
【Groovy】闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )
【Groovy】闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )
234 0
【Groovy】闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )
|
JavaScript
48、Event 对象
事件发生以后,会产生一个事件对象,作为参数传给监听函数。浏览器原生提供一个Event对象,所有的事件都是这个对象的实例,或者说继承了Event.prototype对象。
117 0
|
Java Spring 微服务
JFinal-event v2.3.0 发布,简化 Event 事件类
说明 JFinal-event 2.x 参考 Spring 4.2.x 中 Event 的使用方式而生,为 JFinal 用户带来更多方便。其核心目标是深层次解耦,为您节约更多时间,去陪恋人、家人和朋友 :) 年初 @idoz 提议实现类似 Spring 4.2 里的 PayloadApplicationEvent,其实我早就有此想法,一直没有抽出时间来折腾。
2044 0
|
程序员
错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
原文:错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序. 转载于(https://social.
2475 0