2012-02-10 40 views
1

我需要一點幫助!在運行時將事件處理程序添加到一個控件,其中的主體源代碼存儲在變量中

我在運行時創建自定義控件,反序列化包含信息的xml。 我的自定義控件有兩個屬性,一個是事件名稱,另一個是事件引發時執行的代碼(即方法體)。

我提取了兩個變量的值。我需要的是在運行時爲執行存儲在變量中的代碼的事件添加和處理我的控件。

string eventName = "Click"; 
string codeToRun= "MessageBox.Show(\"Hello!\");" 
Type tControl = result.GetType(); 
EventInfo ev = tControl.GetEvent(eventName); 
Type tDelegate = ev.EventHandlerType; 
MethodInfo addHandler = ev.GetAddMethod(); 

Type returnType = tDelegate.GetMethod("Invoke").ReturnType; 

ParameterInfo[] parameters = tDelegate.GetMethod("Invoke").GetParameters(); 
Type[] typeParameters = new Type[parameters.Length]; 
for (int i = 0; i < parameters.Length; i++) 
{ 
    typeParameters[i] = parameters[i].ParameterType; 
} 

DynamicMethod handler = new DynamicMethod(
         "", 
         null, 
         typeParameters); 

//here I need to compile and add my custom source code stored in codeToRun 

Delegate dEmitted = handler.CreateDelegate(tDelegate); 
addHandler.Invoke(result, new Object[] { dEmitted }); 

有什麼建議嗎? 預先感謝您的幫助!

回答

1

我不清楚爲什麼你首先要獲取addHandler方法。你能不能撥打:

ev.AddEventHandler(result, dEmitted); 

?如果你已經正確地創建了委託,那應該沒問題,並且比直接調用add處理方法更簡單。

如果您的問題實際上是關於創建動態方法的,那麼這是另一回事:您可能希望查看CSharpCodeProvider以將源代碼動態編譯爲程序集。我認爲這是一個完全獨立於事件處理部分的練習 - 讓編譯工作,然後讓事件處理程序連接工作。

您可能想看看Snippy的源代碼作爲您如何使用CSharpCodeProvider的示例 - 這是我爲深入C#編寫的一個簡單工具,它只是讓您編譯和運行代碼片段。

+0

好的,我已經根據你的建議簡化了它。 但現在的問題是,我怎麼可以將代碼的主體添加到我想要執行的代碼(存儲在codeToRun中的代碼)?在CSharpCodeProvider的幫助下?我沒有找到這樣的例子。 – kikka 2012-02-10 14:56:58

相關問題