2017-08-29 4 views
1

プライベートフィールドのパブリック関数にアクセスする必要があります。Reflectを使用してプライベートフィールドでパブリック関数を呼び出すC#

public partial class Form1 : Form 
{ 
    MainControl mainControl = new MainControl(); 
    public Form1() 
    { 
     InitializeComponent(); 
     var frame = mainControl.GetType().GetField("CustomControl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
     frame.GetType().GetMethod("Display").Invoke(mainControl, new object[] { }); 
    } 
} 

public class MainControl 
{ 
    public MainControl() 
    { 
     CustomControl = new CustomControl(); 
    } 

    CustomControl CustomControl; 
} 

public class CustomControl 
{ 
    public CustomControl() 
    { 

    } 

    public void Display() 
    { 
     MessageBox.Show("Displayed"); 
    } 
} 

は、ここで私はCustomControlクラスの表示機能を起動する必要があります。

しかし、上記のアプローチでは例外が発生しています。誰かが私にこれを助けることができますか?

+0

例外は何ですか? – robjwilkins

+0

設計時に 'Modifiers'プロパティを' Public'に設定することでコントロールを公開することができますか? –

答えて

1

反射が非常によく分からないようです。これらの手順を実行する必要がありDisplay呼び出すには:FieldInfo

  • CustomControl
  • ためTypeからMethodInfoをゲットインスタンスにmainControl
  • を使用してCustomControlの値を取得するよう

    • CustomControlフィールドを取得しますTypeCustomControl
    • という値を持つメソッドDisplayを呼び出しますF CustomControl

    あなただけの最初のステップを行った後、ちょうどtypeof(FieldInfo)であるあなただけだフィールドの型を取得するために進め、その後、あなたはFieldInfoからDisplayを取得しよう。 FieldInfoにはそのような方法はありません。

    各行が上記の手順の1つに対応するようにこのコードを作成するのが便利です。

    var fieldInfo = mainControl.GetType().GetField("CustomControl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
    var valueOfField = fieldInfo.GetValue(mainControl); 
    var customControlType = fieldInfo.FieldType; 
    var methodInfo = customControlType.GetMethod("Display"); 
    methodInfo.Invoke(valueOfField, new object[] {}); 
    
  • +0

    'var customControlType = typeof(CustomControl);'を 'var customControlType = fieldInfo.FieldType;'に変更すると、より一般的な –

    +0

    @JakubDąbekが編集されます。 – Sweeper

    関連する問題