是否可以在 C# 中获取事件处理程序的实例



是否可以在 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

相关内容

  • 没有找到相关文章

最新更新