0

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

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

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 回答