2013-07-07 1 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

당신은 또한 빠른 응답을위한 이벤트 핸들러에 –

+0

감사 CreateDelegate의 결과를 캐스팅해야합니다. 이것은 매우 도움이되었습니다. –

4

사실 올바른 서명이 없기 때문에 MyEvent의 처리기로 DoSomething을 사용할 수 없습니다. 이에 DoSomething의 서명을 변경 가정 :

public void DoSomething(object sender, EventArgs e) 

는이 같은 이벤트를 구독 할 수 있습니다 :

if (method != null) 
    { 
     var dlg = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), aType, method); 
     MyEvent += dlg; 
    } 
관련 문제