2013-07-07 3 views
0

См. Ниже образец. Мне нужно подключить метод DoSomething, полученный при отражении события.Как подключить событие с отражением

class Program { 
    private static event EventHandler MyEvent; 

    static void Main(string[] args) 
    { 
     object aType = new SomeType(); 

     var type = aType.GetType(); 

     var method = type.GetMethod("DoSomething"); 

     if (method != null) 
     { 
      MyEvent += method;//How do I wire this up? 
     } 
    } 
} 


public class SomeType { 
    public void DoSomething() { 
     Debug.WriteLine("DoSomething ran."); 
    } 
} 

ответ

4

Вы должны создать делегат:

MyEvent += (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method); 

Вторым аргументом является экземпляр для привязки делегата.
Для получения дополнительной информации см. my blog.

Как и любой другой делегат, это будет работать только в том случае, если целевой метод имеет одну и ту же подпись (типы параметров) в качестве делегата.

+0

Вы также должны отбрасывать результат CreateDelegate к EventHandler –

+0

Спасибо за быстрый ответ. Это было очень полезно. –

4

На самом деле, вы не можете использовать DoSomething в качестве обработчика для MyEvent, так как он не имеет правильной подписи. Предполагая, что вы измените подпись DoSomething к этому:

public void DoSomething(object sender, EventArgs e) 

Вы можете подписаться на событие, как это:

if (method != null) 
    { 
     var dlg = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method); 
     MyEvent += dlg; 
    } 
Смежные вопросы