具有自定义事件参数的C#reflection编程事件处理程序
这是我的问题/场景
public class TestEventArgs : EventArgs { public int ID { get; set; } public string Name { get; set; } } public event EventHandler TestClick
如何使用reflection在TestClick上附加EventHandler? (obj是实例,Activator.CreateInstance)
EventInfo eventClick = obj.GetType().GetEvent("TestClick"); Delegate handler = Delegate.CreateDelegate(eventClick.EventHandlerType, obj, ????); eventClick.AddEventHandler(obj, handler);
我的问题是TestEventArgs是在外部dll中声明的,但是???? 上面的methodinfo需要在其委托中签名?
我设法通过遵循以下文章描述的技术来使我的代码工作, http://www.pelennorfields.com/matt/2009/03/13/createdelegate-error-binding-to-target-method/
本质上,如果我执行以下操作,我会收到错误“绑定到目标方法的错误”,
失败:
EventInfo eventClick = obj.GetType().GetEvent("TestClick"); Delegate handler = Delegate.CreateDelegate( eventClick.EventHandlerType, this, "TestClick"); eventClick.AddEventHandler(obj, handler);
成功:
但当我把它改为:
MethodInfo methodOn_TestClick = this.GetType().GetMethod("TestClick", new Type[] { typeof(object), typeof(EventArgs)); Delegate handler = Delegate.CreateDelegate( event_DomClick.EventHandlerType, this, methodOn_TestClick, true); // note the change here eventClick.AddEventHandler(obj, handler);
然后我在TestClick方法中使用了reflection,从标准的EventArgs中获取了我需要的属性。
例如。
public void TestClick(object sender, EventArgs e) { PropertyInfo prop_ID = e.GetType().GetProperty("ID"); int id = Convert.toInt32(prop_ID.GetValue(e, null)); }
你控制目标组件的来源吗? 如果是这样,只需将InternalsVisibleTo程序集属性添加到目标程序集即可。
如果您使用了Activator.CreateInstance()
那么您可以参考对象的类型吗?
要添加自己的处理程序:
调用type.GetFields()
就可以了,现在你已经有了内部字段了(如果事件是在基类中定义的,你需要首先使用type.BaseType
向上走type.BaseType
,然后达到一个级别到达级别你需要)。
一旦你有一个FieldInfo
实例供委托支持事件处理程序调用FieldInfo
实例上的GetValue()
传递你的对象。现在你有代理支持事件处理程序。 现在调用FieldInfo.SetValue(myObject, Delegate.Combine(currentValue, myHandler))
。
我很确定使用Delegate.Combine你只需确保事件处理程序的签名匹配,但不是实际类型。 因此,使用相同的签名创建自己的委托应该足够了。
- 好的做法是在方法中多使用一个RETURN语句吗?
- Android语音识别将数据传回Xamarin Forms
- 使用.Net native在发布模式下编译UWP应用程序时出现内存不足错误
- 远程处理或WCF用于新开发(在同一台机器上的两个.NET应用程序之间)使用接口?
- 如何在.net 4.0中使用asyn / await? AsyncTargetingPack和Microsoft.Bcl.Async之间的区别?
- 客户端和服务器无法通信,因为它们在Windows Server 2008 Web上没有通用算法
- 向TreeView添加文件夹结构需要数小时
- 在Windows XP中使用“打开文件”对话框时,为什么当前工作目录会更改?
- 创建从C到C#的混合模式C ++桥接?