2012-09-27 25 views
-1

是否有可能在C#中獲取事件處理程序的實例? 就像在C++中獲取函數指針一樣。我想要的是獲取文本框的事件處理程序,它可能在不同的部分和不同的時間設置不同。是否有可能在C#中獲得事件處理程序的實例?

例子: 一個TextBox,我們有像下面的代碼:

TextBox tbUserName; 
tbUserName.Click += new EventHandler((s, e) => { MessageBox.Show("bla") }); 

我想另一個函數能夠得到這樣的處理程序:

EventHandler h = tbUserName.Click; 

但它不工作。什麼編譯器說,點擊只支持+ = - =但不能在右側。

+4

什麼不同部位和不同的時間呢?你能提供一個你正在努力完成的具體事例嗎? –

回答

0

你可以n檢索事件的調用列表,並且可以從每個調用中檢索目標(對於靜態eventhandler方法可以爲null)和MethodInfo。

事情是這樣的:

public class TestEventInvocationList { 
    public static void ShowEventInvocationList() { 
     var testEventInvocationList = new TestEventInvocationList(); 
     testEventInvocationList.MyEvent += testEventInvocationList.MyInstanceEventHandler; 
     testEventInvocationList.MyEvent += MyNamedEventHandler; 
     testEventInvocationList.MyEvent += (s, e) => { 
      // Lambda expression method 
     }; 

     testEventInvocationList.DisplayEventInvocationList(); 
     Console.ReadLine(); 
    } 

    public static void MyNamedEventHandler(object sender, EventArgs e) { 
     // Static eventhandler 
    } 

    public event EventHandler MyEvent; 

    public void DisplayEventInvocationList() { 
     if (MyEvent != null) { 
      foreach (Delegate d in MyEvent.GetInvocationList()) { 
       Console.WriteLine("Object: {0}, Method: {1}", (d.Target ?? "null").ToString(), d.Method); 
      } 
     } 
    } 

    public void MyInstanceEventHandler(object sendef, EventArgs e) { 
     // Instance event handler 
    } 
} 

這將產生:

Object: ConsoleApplication2.TestEventInvocationList, Method: Void MyInstanceEven 
tHandler(System.Object, System.EventArgs) 
Object: null, Method: Void MyNamedEventHandler(System.Object, System.EventArgs) 
Object: null, Method: Void <MyMain>b__0(System.Object, System.EventArgs) 
0

該事件實際上是一個多播委託,處理程序可以用簡單的+ =和 - =語法指定。

例如...

private void myButton_Click(object sender, EventArgs e) 
{ 

    // Do something in here... 

} 

... 
... 

myButton.Click += myButton_Click; 
0
  • 在C#中,沒有單獨的事件處理程序的類型,但事件 機制是建立在委託類型的頂部。
  • 委託/多播刪除對象類似於C++函數指針,它可以存儲一個更多的方法地址並且可以調用。
  • C#提供了關鍵字事件形式的合成糖,然後 成爲一個多播委託,一旦源代碼被編譯。
  • 活動可以訂閱和退訂

要訂閱:<event> += <method> 取消訂閱:<event> -= <method>

顯示三種方法簽約了同click事件

tbUserName.Click += new EventHandler((s, e) => { MessageBox.Show("method 1 called") }); 
tbUserName.Click += new EventHandler((s, e) => { MessageBox.Show("method 2 called") }); 
tbUserName.Click += new EventHandler((s, e) => { MessageBox.Show("method 3 called") }); 

http://msdn.microsoft.com/en-us/library/17sde2xt(v=VS.100).aspx

代碼
+0

謝謝你,Codelgnote,我想要的是「功能指針」,所以我用它在別的地方。 – Roy

+0

已做出編輯以保持其相關性完好無損 –

相關問題