Получить тип обработчика автоматически - PullRequest
0 голосов
/ 06 августа 2011
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. Я хочу автоматически получить тип обработчика, например, если тип события является ключом, добавить KeyDownEventHanler Howя могу сделать это? Спасибо

1 Ответ

0 голосов
/ 06 августа 2011

Вы можете создать делегат любого типа с помощью метода Delegate.CreateDelegate (...). Также создание анонимного метода, использующего InvokeMember для вызова метода «Узел», не является обязательным, если параметры вашего метода «Узел» совместимы по назначению с параметрами делегата и, следовательно, не требуется никакого специального преобразования параметров. Тогда вместо

TreeNodeMouseClickEventHandler myCode =(s,k)=>
{
    tip.InvokeMember("Node",
        BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
        null,
        obje,
        new object[]{s,k});
};

просто создайте делегат для метода "Узел", того же типа, который ожидает событие:

MethodInfo NodeMethod = tip.GetMethod("Node", BindingFlags.Instance | BindingFlags.Public);
Delegate myCode = Delegate.CreateDelegate(evt.EventHandlerType, obje, NodeMethod);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...