自动获取处理程序类型

本文关键字:程序 类型 处理 获取 | 更新日期: 2023-09-27 18:04:45

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

我可以用下面的代码为控件添加一个事件处理程序。但如果我想要一个按钮点击事件,我必须使用eventler。我想获得处理程序类型自动像如果事件类型是我该怎么做呢?由于

自动获取处理程序类型

您可以使用delegate . createdelegate(…)方法创建任何类型的委托。此外,创建使用InvokeMember调用"Node"方法的匿名方法是没有必要的,只要你的"Node"方法的参数与委托的参数是赋值兼容的,因此不需要特殊的参数转换。而不是

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