.NETの常識?
私はJavaの経験をある程度経てから.NETに、いきなり移行してきた事もあり、もう2年も経つというのに、未だに.NETの常識に驚かされることが多い。(単に勉強不足なだけだが)
スーパークラスの定数をリフレクションで取得したいと思い、以下のようなコードを書いたとする。
public class SuperClass { public const string superString = "this is super class constant"; } public class SubClass : SuperClass { static void Main() { Type type = typeof(SubClass); FieldInfo fieldInfo = type.GetField ("superString"); Console.WriteLine (fieldInfo.GetValue(null)); } }
定数superStringはpublicスコープなのだし、派生クラスからは特別なフラグを指定する必要無しに見えるのだろうな、と思って実行すると、type.GetField ("superString");で、フィールド情報が取れない。ならばと思い、明示的にBindingFlags.Public | BindingFlags.Staticを指定したが、それでも取得できなかった。
.NETの場合、継承元のフィールドはpublicであってもデフォルトでは取得できないようだ。取得するためには以下のように、BindingFlags.FlattenHierarchyを指定しなくてはならない。
FieldInfo fieldInfo = type.GetField ("superString", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
むう。今まで書いてきたリフレクションのコードのBindingFlagsを全て見直す必要がありそうだ。