var myassembly = BuildAssembly(new System.IO.StreamReader("Code.txt").ReadToEnd());
Type tip = myassembly.GetType("Form1");
var obje = Activator.CreateInstance(tip);
var obj = treeView1;
string eventName = "NodeMouseClick";
var evt = obj.GetType().GetEvent(eventName);
TreeNodeMouseClickEventHandler myCode =(s,k)=>
{
tip.InvokeMember("Node",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, obje ,new object[]{s,k});
};
evt.AddEventHandler(obj, myCode);
我可以使用此代码添加一个事件处理程序控件。但是如果我想要一个按钮单击事件我必须使用EventHanler.I想要自动获取Handler类型,就像事件类型是 key down add KeyDownEventHanler我该如何做到这一点?谢谢
答案 0 :(得分:0)
您可以使用Delegate.CreateDelegate(...)方法创建任何类型的委托。只要您的“节点”方法的参数与委托的参数分配兼容,并且因此不需要特殊的参数转换,也不需要创建使用InvokeMember来调用“节点”方法的匿名方法。然后而不是
TreeNodeMouseClickEventHandler myCode =(s,k)=>
{
tip.InvokeMember("Node",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null,
obje,
new object[]{s,k});
};
只需创建委托给“Node”方法,该方法与事件期望的类型相同:
MethodInfo NodeMethod = tip.GetMethod("Node", BindingFlags.Instance | BindingFlags.Public);
Delegate myCode = Delegate.CreateDelegate(evt.EventHandlerType, obje, NodeMethod);