自动获取处理程序类型

时间:2011-08-06 08:37:59

标签: c# events event-handling

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我该如何做到这一点?谢谢

1 个答案:

答案 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);