2011-03-19 8 views
4

DLL이 2 개 있습니다. A.dll에 다음이 포함되어 있습니다.리플렉션을 사용하여 이벤트에 대한 대리인 연결

namespace Alphabet 
{ 
    public delegate void TestHandler(); 

    public class A 
    { 
     private void DoTest() 
     { 
      Type type = Assembly.LoadFile("B.dll").GetType("Alphabet.B");      

      Object o = Activator.CreateInstance(type); 

      string ret = type.InvokeMember("Hello", BindingFlags.InvokeMethod | BindingFlags.Default, null, o, null); 
     } 
    } 
} 

namespace Alphabet 
{ 
    public class B 
    { 
     public event TestHandler Test(); 

     public string Hello() 
     { 
      if (null != Test) Test(); 
      return "Hello"; 
     } 
    } 
} 

InvokeMember을 사용하여 B.dll에서 결과를 가져오고 B.dll도 필요합니다. 결과를 반환하기 전에 Test()합니다. 그렇다면 어떻게하면 반사를 통해 delegateevent의 B.dll에 연결할 수 있습니까?

어떤 도움을 주시면 감사하겠습니다!

답변

7

typeof(B).GetEvent("Test")으로 이벤트를 가져온 다음 EventInfo.AddEventHandler으로 연결하십시오. 샘플 코드 :

using System; 
using System.Reflection; 

public delegate void TestHandler(); 

public class A 
{ 
    static void Main() 
    { 
     // This test does everything in the same assembly just 
     // for simplicity 
     Type type = typeof(B); 
     Object o = Activator.CreateInstance(type); 

     TestHandler handler = Foo; 
     type.GetEvent("Test").AddEventHandler(o, handler); 
     type.InvokeMember("Hello", 
          BindingFlags.Instance | 
          BindingFlags.Public | 
          BindingFlags.InvokeMethod, 
          null, o, null); 
    } 

    private static void Foo() 
    { 
     Console.WriteLine("In Foo!"); 
    } 
} 

public class B 
{ 
    public event TestHandler Test; 

    public string Hello() 
    { 
     TestHandler handler = Test; 
     if (handler != null) 
     { 
      handler(); 
     } 
     return "Hello"; 
    } 
} 
+0

빠른 답변 감사합니다. – ByulTaeng

관련 문제