-1

C#でイベントハンドラのインスタンスを取得することは可能ですか? C++ で関数ポインタを取得するのと同じように

私が欲しいのは、テキストボックスのイベントハンドラーを取得することです。これは、異なる部分と異なる時間で異なる設定になる可能性があります。

例: TextBox の場合、次のようなコードがあります。

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

別の関数が次のようにハンドラーを取得できるようにしたい:

EventHandler h = tbUserName.Click;

しかし、うまくいきません。コンパイラが言ったこと、クリックは += -= のみをサポートしますが、右側にはできません。

4

3 に答える 3

0

イベントは事実上マルチキャストデリゲートであり、ハンドラーは単純な+=および-=構文で指定できます。

例えば...

private void myButton_Click(object sender, EventArgs e)
{

   // Do something in here...

}

...
...

myButton.Click += myButton_Click;
于 2012-09-27T10:23:09.397 に答える
0
  • C#では、個別のイベントハンドラータイプはありませんが、イベントメカニズムはデリゲートタイプの上に構築されています。
  • デリゲート/マルチキャストデリゲートオブジェクトは、c ++関数ポインターに似ており、1つ以上のメソッドアドレスを格納でき、呼び出すことができます。
  • C#は、キーワードイベントの形式でシンタティックシュガーを提供します。これは、ソースコードがコンパイルされると、マルチキャストデリゲートになります。
  • イベントは、サブスクライブおよびサブスクライブ解除できます

購読するには:購読<event> += <method> を解除するには:<event> -= <method>

同じクリックイベントにサブスクライブする3つのメソッドを示すコード

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

于 2012-09-27T10:41:06.987 に答える
0

イベントの invocationlist を取得できます。また、各呼び出しから、ターゲット (静的イベント ハンドラー メソッドの場合は 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)
于 2012-09-27T10:57:07.677 に答える