当前位置:  编程技术>.net/c#/asp.net

C#中事件的动态调用实现方法

    来源: 互联网  发布时间:2014-11-03

    本文导语:  本文实例讲述了C#动态调用事件的方法。一般来说,传统的思路是,通过Reflection.EventInfo获得事件的信息,然后使用GetRaiseMethod方法获得事件被触发后调用的方法,再使用MethodInfo.Invoke来调用以实现事件的动态调用。 但是很不幸...

本文实例讲述了C#动态调用事件的方法。一般来说,传统的思路是,通过Reflection.EventInfo获得事件的信息,然后使用GetRaiseMethod方法获得事件被触发后调用的方法,再使用MethodInfo.Invoke来调用以实现事件的动态调用。

但是很不幸的,Reflection.EventInfo.GetRaiseMethod方法始终返回null。这是因为,C#编译器在编译并处理由event关键字定义的事件时,根本不会去产生有关RaiseMethod的元数据信息,因此GetRaiseMethod根本无法获得事件触发后的处理方法。Thottam R. Sriram 在其Using SetRaiseMethod and GetRaiseMethod and invoking the method dynamically 一文中简要介绍了这个问题,并通过Reflection.Emit相关的方法来手动生成RaiseMethod,最后使用常规的GetRaiseMethod来实现事件触发后的方法调用。这种做法比较繁杂。

以下代码是一个简单的替代方案,同样可以实现事件的动态调用。具体代码如下:

public event EventHandler MyEventToBeFired;  
public void FireEvent(Guid instanceId, string handler)    
{     
  // Note: this is being fired from a method with in the same class that defined the event (i.e. "this").      
  EventArgs e = new EventArgs(instanceId);  
  MulticastDelegate eventDelagate = (MulticastDelegate)this 
   .GetType()  
   .GetField(handler, BindingFlags.Instance | BindingFlags.NonPublic)
   .GetValue(this);  
  Delegate[] delegates = eventDelagate.GetInvocationList();  
  foreach (Delegate dlg in delegates)  
  {  
    dlg.Method.Invoke( dlg.Target, new object[] { this, e } );  
  }  
}  
FireEvent(new Guid(), "MyEventToBeFired");

希望本文所述对大家的C#程序设计有所帮助


    
 
 

您可能感兴趣的文章:

  • C# DoubleClick与MouseDoubleClick区别,双击事件引发顺序
  • C#中事件的继承实例分析
  • C#实现自定义双击事件
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • c# ListView实现双击Item事件的变通方法
  • C#事件处理和委托event delegate实例简述
  • 解读在C#中winform程序响应键盘事件的详解
  • C# ListView双击Item事件
  • C#实现WinForm捕获最小化事件的方法
  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法
  • C# KeyUp事件中MessageBox的回车(Enter)键回调问题解决方案
  • c# 托盘双击不触发单击事件的实现方法
  • 不能在子类或外部类发布C#事件代码分析
  • C#控制台程序中处理2个关闭事件的代码实例
  • C#程序窗体间使用回调事件方式通讯示例
  • C#事件访问器详解
  • C# 中如何利用lambda实现委托事件的挂接
  • c#捕获windows关机事件的实现代码
  • c#事件使用示例详解
  • C#中winform实现自动触发鼠标、键盘事件的方法
  • 如何在别的过程调用鼠标事件
  • 我想调用图片的单击事件,再用函数动态加载图片,这样为什么不能实现???
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JTextArea 怎么没有textChanged事件?怎样实现这个事件?(一定有分)
  • 如何用代码手工实现激活事件发生
  • 怎样实现菜单和工具栏的事件传递的统一??
  • 如何在linux下实现event事件机制
  • 我想问一下java的事件驱动机制是如何实现的,如何实现自定义的事件驱动?不够再加100!
  • Java List双击事件实现方法
  • jquery 回车事件的实现代码
  • asp.net Textbox控件注册回车事件与触发按钮提交事件的实现方法
  • 求助:怎样用jsp实现获得鼠标事件!
  • jquery中交替点击事件的实现代码
  • jQuery实现当按下回车键时绑定点击事件
  • 是不是applet不能实现事件监听器接口啊?
  • jquery实现input输入框实时输入触发事件代码
  • 按Enter键触发事件的jquery方法实现代码
  • Windows下的消息时间事件机制在Unix下如何实现?
  • jQuery自定义事件的简单实现代码
  • WinForm实现移除控件某个事件的方法
  • Android中button实现onclicklistener事件的两种方式
  • php实现事件监听与触发
  • jQuery scroll事件实现监控滚动条分页示例
  • window.onload事件覆盖掉body onload事件(window.onload和html body onload事件冲突)解决办法
  • NOSQL iis7站长之家
  • Python 3 Tkinter教程之事件Event绑定处理代码实例
  • 我的一个jComboBox下拉组件,在加入itemStateChanged()监听事件后速度就非常慢,我在事件响应部分没有加任何代码也是慢?去掉监听事件后就一切正常,为何?
  • IOS开发:UIScrollView类介绍及如何简单地截获touch事件
  • 事件能传递吗,就是子类触发了一个鼠标事件,能不能也将这个鼠标事件发给父类
  • jquery阻止后续事件只执行第一个事件
  • 在JBuilder中窗体的什么事件与Delphi中的窗体的CloseQuery事件相同?
  • swing事件里怎么没有鼠标右键产生的事件?
  • 使用epoll lt或者et 每次wait到一个事件处理完后是否需要重新投递事件呢?
  • jquery button默认enter事件(回车事件)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3