リフレクションを使用して既知のクラスからプライベート静的フィールドの値を取得する方法はありますか?
はい。
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
これはフィールド用です。プロパティの場合は、type.GetField
をtype.GetProperty
に変更します。同様の方法でプライベートメソッドにアクセスすることもできます。
誰かがこれが良い考えかどうか尋ねるべきだと思いますか?この静的クラスのプライベート実装への依存関係を作成します。プライベート実装は、Reflectionを使用してプライベート実装にアクセスする人々に通知することなく変更される場合があります。
2つのクラスが連携することを意図している場合は、フィールドinternalを作成し、[Assembly:InternalsVisibleTo]属性に協調クラスのアセンブリを追加することを検討してください。
上で述べたように、おそらく System.Type::GetMembers()
with BindingFlags
::NonPublic | BindingFlags::Static
を使用できますが、権利がある場合に限ります- ReflectionPermission
。
あなたが完全な信頼を持っているならば、あなたはすることができるはずです:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
ただし、これを完全な信頼のないシステムで実行すると、GetField呼び出しは失敗し、これは機能しません。