web-dev-qa-db-ja.com

クラスからプライベート静的フィールドの値を取得するにはどうすればよいですか?

リフレクションを使用して既知のクラスからプライベート静的フィールドの値を取得する方法はありますか?

32
chief7

はい。

Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);

これはフィールド用です。プロパティの場合は、type.GetFieldtype.GetPropertyに変更します。同様の方法でプライベートメソッドにアクセスすることもできます。

66
configurator

誰かがこれが良い考えかどうか尋ねるべきだと思いますか?この静的クラスのプライベート実装への依存関係を作成します。プライベート実装は、Reflectionを使用してプライベート実装にアクセスする人々に通知することなく変更される場合があります。

2つのクラスが連携することを意図している場合は、フィールドinternalを作成し、[Assembly:InternalsVisibleTo]属性に協調クラスのアセンブリを追加することを検討してください。

5
John Saunders

上で述べたように、おそらく System.Type::GetMembers() with BindingFlags::NonPublic | BindingFlags::Staticを使用できますが、権利がある場合に限ります- ReflectionPermission

2
i_am_jorf

あなたが完全な信頼を持っているならば、あなたはすることができるはずです:

Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);

ただし、これを完全な信頼のないシステムで実行すると、GetField呼び出しは失敗し、これは機能しません。

0
Reed Copsey