派生クラスにて、基底クラスの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
ちょっとソースは長くなるが、これだとビルドエラーにはならず、実行も問題ない。