2011-08-06 48 views
0
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); 

,如果我想我可以添加一個事件處理程序的控制與此code.But到一個按鈕單擊事件我不得不使用EventHanler.I要自動獲取處理程序類型一樣,如果事件類型是 key down添加KeyDownEventHanler我該怎麼做?謝謝獲取處理器類型自動

回答

0

您可以使用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); 
+0

非常感謝它是工作 – YardimaIhtiyaciOlan