0

これを説明する別の質問がある場合は、それを見つけることができなかったことをお詫びしますが、私がやろうとしていることに関連するいくつかの用語に慣れていないことが関係しているのではないかと思います.

私がやろうとしているのは、名前でボタンにイベントハンドラーを追加することです。たとえば、以下のコードでは、showInfo を追加したいことを知る代わりに、"showInfo" のように名前 (文字列) で EventHandler を参照できますか?

myButton.Click += new EventHandler(showInfo);

void showInfo(object sender, EventArgs e)
{
    // ..
}
4

1 に答える 1

2

リフレクションを介してメソッドからデリゲートを作成し、それをリフレクションを介してイベントにサブスクライブできます。サンプルコード:

using System;
using System.Reflection;

class Publisher
{
    public event EventHandler Foo;

    public void RaiseFoo()
    {
        EventHandler handler = Foo;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

class Subscriber
{
    public void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine("In HandleEvent");
    }
}

class Test
{
    static void Main()
    {
        var subscriber = new Subscriber();
        var publisher = new Publisher();

        var methodInfo = typeof(Subscriber).GetMethod("HandleEvent");
        var handler = (EventHandler) Delegate.CreateDelegate(
               typeof(EventHandler), subscriber, methodInfo);

        var eventInfo = typeof(Publisher).GetEvent("Foo");
        eventInfo.AddEventHandler(publisher, handler);

        publisher.RaiseFoo();
    }    
}
于 2012-05-18T23:54:10.050 に答える