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

本文实例讲述了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<EventArgs> 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#中事件的动态调用实现方法

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23546.html

相关内容

ò????éDˉ′????ó???¢μ????????¢?òMessageBoxEx

C#实现在listview中插入图片实例代码

C#中使用基数排序算法对字符串进行排序的示例

在C#中如何使用正式表达式获取匹配所需数据


C#访问SQL Server数据库的实现方法

C#实现的调用DOS命令操作类实例

C#实现农历日历的方法

浅谈对c# 面向对象的理解

时间: 2024-10-11 17:54:10

C#中事件的动态调用实现方法的相关文章

C#中WebBrowser.DocumentCompleted事件多次调用问题解决方法

关于DocumentCompleted事件,MSDN给出的解释是在文档加载完毕后执行,但是在我的程序中DocumentCompleted却被多次调用,查了一下资料,大概出现了以下几种情况. 1.WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complete.而MSDN对这两种状态值的解释是:Complete该控件已完成新文档及其所有内容的加载:Interactive该控件已经加载足够的文

Struts2的动态调用action方法

动态调用action方法,是指用 action!method 格式的请求来请求后台的逻辑处理 前提条件:在struts.xml或者struts.properties中配置 struts.enable.DynamicMethodInvocation常量为true ,否则动态调用不可用 查看源码:      在org.apache.struts2.dispatcher.mapper.DefaultActionMapper中 protected ActionMapping parseActionNam

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把查询结果的 HTML 代码呈现到 Razor 视图中,考虑到灵活性,需要能在任意 Razor 视图中调用该方法,这样任意 Razor 页面都能以统一的方式方便地共享该页面部件的 HTML 内容,这对于代码的重用性和可维护性都是非常有必要的. 为实现上述要求,本文介绍如下可供选择的三种方式.   1.

Caliburn框架中二级Menu无法调用ViewModel方法

公司WPF程序开发中应用了Caliburn框架,最近在做一个DataGrid上二级MenuItem时,发现Click方法无法调用ViewModel中的方法,但是回来后,在自己的机器上写了一个类似的测试程序时,却能够调用ViewModel中的方法 测试程序DataGrid 1 <DataGrid CanUserAddRows="False" AutoGenerateColumns="True" ItemsSource="{Binding Collect

knockout.js(js)代码在IE中出现“意外地调用了方法或属性”的错误

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 var CartListViewModel = function () {     var self = this;     self.payment = [                 { name: "", value: 1

JavaScript的 onclick 事件是如何调用jquery 方法的

看见个不错的问答,关于JavaScript的 onclick 事件是如何调用jquery 方法的,特此标注,链接如下:http://segmentfault.com/q/1010000000333507

cocos2d 中使用jni C++ 调用 Java 方法

1.简单数据类型例子 假设我们Java中有这么一个open的静态方法,它没有参数,有一个int的返回值.怎么在C++中调用它呢? package cb.CbCCBLE; public class CbCCBLECentralManager { public static final String TAG = "CbCCBLECentralManager Android"; public static int open() { Log.d(TAG,"open"); r

cocos2d 中使用jni Java 调用 C++ 方法

1.首先是LoadLibrary cocos2d中的C++代码会编译成一个.so文件,放在安卓目录下的libs/armeabi 下,然后java会load进来,这步我们不用做了,因为cocos2d已经帮我们做好了. package cb.CbCCBLE; public class CbCCBLECentralManager { public static final String TAG = "CbCCBLECentralManager Android"; public native

cocos2d-x中使用JNI的调用JAVA方法

用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化语言(如C\C++)与JAVA语言进行交互.在交互过程成中,JAVA调用的是已编译好的本地化语言的二进制代码(如Windows下的dll.Linux下的so文件).所以在交叉编译时看到Eclipse的控制台输出 [armeabi] SharedLibrary  : libcocos2dcpp.so