2017-02-26 13 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

こんにちは、ローマ、あなたの助けに感謝します!これは動作していないようだが、動作させることができた。 CreateDelegateに問題があり、それを修正するために 'null'の代わりに' this'を渡します。あなたの助けをもう一度ありがとう。 – Steph

+0

@Steph、あなたは歓迎ですが、私がヌルを渡すと私のために働きます。また、 'this'を渡すと動作します。 –

関連する問題