2012-05-18 92 views
0

如果还有另外一个问题可以解释这一点,我很抱歉无法找到它,但我认为这可能与我不熟悉涉及我想要做的某些术语有关。按名称获取EventHandler?

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

myButton.Click += new EventHandler(showInfo); 

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

回答

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