按名称获取事件处理程序?(Get EventHandler by name?)

2019-10-29 06:51发布

如果有,说明这一点我不能够找到它道歉另一个问题,但我认为这可能与我的不熟悉一些涉及我想要做的条款做。

我正在试图做的是按名称的事件处理程序添加到按钮。 因此,例如,在下面的代码,而不是知道我要添加showInfo,我可以通过名称引用(字符串),如“showInfo”的事件处理程序?

myButton.Click += new EventHandler(showInfo);

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

Answer 1:

您可以从通过反射的方法的委托,然后通过反射订阅,为的情况下,是的。 示例代码:

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();
    }    
}


文章来源: Get EventHandler by name?