2010-07-12 50 views
3

當通過反射動態地將方法分配給委託實例時,我陷入困境。以下是我面對的情況的一個示例場景。通過反射分配方法進行委託

class Program 
{ 
    static void Main(string[] args) 
    { 
     new DynamicDelegateTest().Test();    
    } 
} 

public class DynamicDelegateTest 
{ 
    public void Test() 
    { 
     //This is what i target to do through reflection 
     ABC objABC1 = new ABC(); 
     objABC1.Proc = Debugger; 
     objABC1.Test("Helloz"); 

     //Implementing the same code through reflection 
     ABC objABC = new ABC(); 
     MethodInfo MIDebugger = GetType().GetMethod("Debugger", BindingFlags.NonPublic | BindingFlags.Instance); 
     FieldInfo MyProc = objABC.GetType().GetField("Proc", BindingFlags.Public | BindingFlags.Instance); 

     //This is the point where I got stuck up 
     MyProc.SetValue(objABC, MIDebugger); 
     objABC.Test("QWERTY"); 
    } 

    void Debugger(object Tests) 
    { 
     Console.WriteLine(Tests); 
    } 
} 

public class ABC 
{ 
    public delegate void Delg(object P1); 
    public Delg Proc; 

    public void Test(object Tst) 
    { 
     if (Proc != null) Proc(Tst); 
    } 
} 

請幫忙。

回答

10

您需要使用Delegate.CreateDelegate來獲取委託實例,而不是方法信息。對於非靜態方法,這也包括目標實例。在這種情況下:

object del = Delegate.CreateDelegate(MyProc.FieldType, this, MIDebugger); 
MyProc.SetValue(objABC, del);