2013-03-20 25 views
-4

我有Delegate類型和function字符串格式。我該如何添加 那個功能在delegate如何通過名稱動態添加事件

Datatable Events;

/* Having Records 

Control Events  MethodName 
ControlName  Validating  Leave  Enter 
TextBox1  Textbox1_Validating TextBox1_Leave -- 

*/ 

foreach(DataRow Row in Events.Rows) 
{ 
    if (Row["Validating"].ToString() != "") 
    { 
//Here is I need a help that how can i add Textbox1_Validating event in 
//TextBox1.Validating 
    } 
} 
+7

顯示您的代碼至今 – 2013-03-20 10:15:15

+2

您正試圖調用委託?或者你是否試圖在對象上調用方法?或者,也許你正在試圖舉辦一個活動?請準確清楚**你需要什麼。 – 2013-03-20 10:16:23

+1

而不是無限期地乞求用戶改進他們不完整的問題,我會建議關閉它們並在SO上節省垃圾問題。要學會如何提出最低限度的體面問題並不困難。附:質量問題也關心英語語法,所以「我」,而不是「我」。不要懶惰! – mloskot 2013-03-20 10:22:39

回答

0

您可以使用Delegate.CreateDelegate重載之一來實現這一目標。但你需要知道目標對象(物體,其中包含你想要的方法被調用時,該事件引起)

一個例子(僞代碼):

public void TextBox1_Validating(object sender, CancelEventArgs args) 
{ 
    // handle the event 
} 


public void RegisterEvent() 
{ 
    CancelEventHandler handler = (CancelEventHandler)Delegate.CreateDelegate(
     typeof(CancelEventHandler), 
     this, 
     "TextBox1_Validating"); 
    textBox1.Validating += handler; 
} 

您還可以閱讀此MSDN文章,其中顯示了其他一些方法:How to: Hook Up a Delegate Using Reflection

+0

thnx斯蒂芬,你帶我離開我的問題。 – AliasgerSW 2013-03-22 20:05:23

2

有些幼稚的做法是從調用拉姆達MethodIndo時使用間接的另一個層次並將其分配給委託Func<int, string>類型的實例。需要注意的是存在着更爲複雜的委託轉換:

void Main() 
{ 
    string methodName = "SomeMethod"; 

    var methodInfo = this.GetType().GetMethod(methodName); 

    Action<string> myFunc = str => methodInfo.Invoke(this, new object[]{str}); 

    MyEvent += myFunc; 

    MyEvent("value"); 

} 
public event Action<string> MyEvent = delegate{}; 
            //default so that not to check for null 

public void SomeMethod(string val) 
{ 
    Console.WriteLine ("event called with: " + val); 
} 

打印

event called with: value 

考慮另一個articles這個話題。真的很難說出你想達到什麼,但我認爲你可以用這個實現作爲起點。

0

委託是一種安全地封裝方法的類型,類似於C和C++中的函數指針。不像C函數指針,委託是對象

更多的信息,您可以參考msdn