是否可以在 C# 中获取事件处理程序的实例?就像在C++中获取函数指针一样
我想要的是获取文本框的事件处理程序,该事件处理程序可能会在不同的部分和不同的时间进行不同的设置。
例:对于文本框,我们有如下代码:
TextBox tbUserName;
tbUserName.Click += new EventHandler( (s, e) => { MessageBox.Show("bla") } );
我希望另一个函数能够像这样获取处理程序:
EventHandler h = tbUserName.Click;
但它不起作用。编译器说,单击仅支持 += -= 但不能在右侧。
您可以检索事件的调用列表,并且从每次调用中可以检索目标(对于静态事件处理程序方法可以为 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)
该事件实际上是一个多播委托,可以使用简单的 += 和 -= 语法指定处理程序。
例如。。。
private void myButton_Click(object sender, EventArgs e)
{
// Do something in here...
}
...
...
myButton.Click += myButton_Click;
- 在C#中,没有单独的事件处理程序类型,但是事件机制建立在委托类型之上。 委托
- /多播委托对象类似于 c++ 函数指针,可以存储一个,多个方法地址,可以调用。
- C#以关键字事件的形式提供了合成糖,它然后成为多播委托,一旦编译了源代码。
- 可以订阅和取消订阅事件
订阅 : <event> += <method>
退订 : <event> -= <method>
显示订阅同一点击事件的三种方法的代码
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