朝会発表テーマ

C#で他クラスのPrivateメソッドを呼び出す方法について

1. アクセス修飾子

C#にはpublic、internal、protected、privateなどのアクセス修飾子があり、どこからでもアクセスできるpublicから、宣言した範囲内でしかアクセスできないprivateまで徐々にアクセス可能な範囲を限定させることができる。

2. 他クラスに宣言したprivateメソッドを実行する

他クラスから使用するためのpublicなクラスにpublicなメソッドとprivateなメソッドを含むクラスを作成することがある。
このクラスを使用する場合、Visual Studioでは後ろに「.」を打つか、ctrlキーを押しながらスペースキーを押すとアクセス可能な一覧が表示される。
表示された一覧にはprivateな変数やメソッドなどが表示されない。
C#では、リフレクションを使用することで、このprivateメソッドにアクセス可能。
ソースコードの先頭にusing System.Reflection;と記述することで使用可能になる。

例1:private変数の値と、引数を加算して値を返すprivateメソッドを定義したpublicクラス
例2:フォームを開いたら例1のクラスからprivate変数の値を取得し画面に表示し、実行ボタンクリック時に画面に入力した値を引数にし、privateメソッドを実行し、画面に値を返すクラス
例3:実行結果画面

例1のPrivate変数から値100を取得
フォームに数値「50」を入力し、実行ボタンを押下することで、メソッドの結果として150を取得。

3. ソースコードの説明

例2の図で使用しているtype.Get●●で、メソッドや変数を取得している。
第一引数に文字列としてメソッド、変数の名前
第二引数にBindingFlagをセットすることで取得可能。
メソッドの場合は、取得したMethodInfoのInvokeメソッドに
第一引数にインスタンス
第二引数にメソッドに渡す引数をobject型配列にしたものをセットし、実行することで、privateメソッドの実行結果を得られる。
変数の場合は、取得したFieldInfoのGetValueメソッドを実行することで、値を取得可能。

4. BindingFlags

名称内容
DeclaredOnly2継承されたメンバーを検索しない
Instance4非静的メンバーを検索する
Static8静的メンバーを検索する
Public16パブリックメンバーを検索する
NonPublic32パブリックでないメンバーを検索する
FlattenHierarchy64階層上位の静的メンバーを検索する

の6種類が存在する。
「|」で区切って記述するか、合計値を記述することで、複数を対象とすることが可能。
今回の例では、静的でなく、パブリックでないメンバーを使用するので、NonPublicとInstanceを指定している。

5. その他

  • privateな変数やメソッドなど、候補に表示されないものも含めて、GetMembersメソッドを使用することで、一覧表示が可能。
  • 発表としてはC#でと書いているが、VB.Netでも可能。
  • Publicで公開していないということは、公開していない理由があるはず。
    公開部分以外のソースコードは予告無く変更されたりするので、実際の使用では公開部分のみを使用したほうが良い。

コメント