2017-02-26 100 views
1

我有一個班級只能通過反思與另一班級互動。我正在與之交流的這個班有一些代表,我正在設置他們。下面有他們的樣子:將班級成員設置爲功能

public class ClassThatIAmReflecting { 
    public delegate void OnSuccessDelegate(bool value); 

    public static OnSuccessDelegate OnSuccess; 

    public void OnClassThatIAmReflectingSuccess(bool arg) { 
     if(OnSuccess != null) 
      OnSuccess(arg); 
    } 
} 

這裏就是我想:

public class MyClass { 

    void Init() { 
     Type type = Type.GetType("ClassThatIAmReflecting"); 

     FieldInfo fieldInfo = type.GetField("OnSuccess", BindingFlags.Public | BindingFlags.Static); 
     fieldInfo.SetValue(null, HandleOnSuccess); 
    } 

    void HandleOnSuccess(bool value) { 
     // do stuff ... 
    } 
} 

我得到的錯誤是,它無法將動作轉換爲對象。任何幫助我如何做到這一點?

+0

什麼的onSuccess?請顯示其他類的代碼 –

+0

OnSuccess正在通過從C++ dll調用的函數調用。 ClassThatIAmReflecting類是一個位於我的C#類和C++ dll之間的橋樑。 – Steph

回答

2

你的類應該是:

public class MyClass 
{ 

    public void Init() 
    { 
     Type type = typeof(ClassThatIAmReflecting); 
     FieldInfo fieldInfo = type.GetField("OnSuccess", BindingFlags.Public | BindingFlags.Static); 
     var fieldType = fieldInfo.FieldType; 

     var methodInfo = this.GetType().GetMethod("HandleOnSuccess", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
     var del = Delegate.CreateDelegate(fieldType, this, methodInfo); 

     fieldInfo.SetValue(null, del); 

     //test 
     ClassThatIAmReflecting.OnSuccess(true); 
    } 

    private void HandleOnSuccess(bool value) 
    { 
     Console.WriteLine("Called"); 
    } 
} 
+0

Hi Roma,感謝您的幫助!這似乎沒有工作,但我能夠得到它運行。 CreateDelegate存在一個問題,爲了解決這個問題,我傳入'this'而不是'null'。再次感謝你的幫助。 – Steph

+0

@Steph,不客氣,但是當我通過'null'時它對我有用。此外,它通過'this'時有效。 –