【C#】アクセスレベルがprivateでも関係なく触る方法(リフレクション)

派生クラスにて、基底クラスのprivateメンバにアクセスする方法。

基底クラスは修正できないけど、派生クラス側で基底クラスのprivateメンバを参照したり変更する必要が出た場合、リフレクション(reflection)機能を使うことで、アクセスできる。

リフレクション(reflection)機能とは

リフレクション機能とは、プログラムの実行時に、メタデータと呼ばれる情報を取り出す機能。

メタデータには、クラスやメンバ変数、アクセスレベルなどの情報が入っている。

コード上で単純に参照した場合、アクセスレベルが参照不可だった場合、ビルドエラーとなるが、リフレクション機能を使うと、コード上ではアクセスしていないので、ビルドできる。

具体的な使い方

まず、コード上でprivateメンバにアクセスしようとして失敗する例。

hogeグループボックスコントロールがprivateだった場合
 :
this.hoge.Enabled = false;
 :

上記の例だと、hogeのアクセスレベルはprivateなのでビルドエラーになる。

次に、リフレクション機能を使った場合。

hogeグループボックスコントロールがprivateだった場合
using System.Reflection;
 :
Type t = this.GetType();

FieldInfo f = t.BaseType.GetField(
  "hoge",
  BindingFlags.NonPublic | 
  BindingFlags.Instance | 
  BindingFlags.GetField | 
  BindingFlags.FlattenHierarchy | 
  BindingFlags.SetField
  );

GroupBox grpBox = (GroupBox)f.GetValue(this);

grpBox.Enabled = false;
 :

BindingFlagsの説明は以下を参照。

BindingFlags 列挙型
https://msdn.microsoft.com/ja-jp/library/system.reflection.bindingflags(v=vs.110).aspx

ちょっとソースは長くなるが、これだとビルドエラーにはならず、実行も問題ない。

投稿者: Output48

中学生の時に初めてHTMLに触れてからホームページ制作を独学で始める。 ベンチャー企業の営業、大手企業のPG・SEを経て、独立。 現在はとある企業のCTOと、変な名前の会社の社長をしてる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください