按名称获取EventHandler?

时间:2012-05-18 23:49:53

标签: string events handler

如果有另一个问题可以解释这个问题我为无法找到它而道歉,但我认为这可能与我对我正在尝试做的一些术语不熟悉有关。

我要做的是按名称向按钮添加一个事件处理程序。例如,在下面的代码中,我不是要知道我想添加showInfo,而是可以通过名称(字符串)引用EventHandler,如“showInfo”?

myButton.Click += new EventHandler(showInfo);

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

1 个答案:

答案 0 :(得分: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();
    }    
}