2012-05-18 89 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(); 
    }  
}