Как получить значение частного статического поля из класса? - PullRequest
32 голосов
/ 10 марта 2009

Есть ли способ получить значение закрытого статического поля из известного класса, используя отражение?

Ответы [ 5 ]

66 голосов
/ 10 марта 2009

Да.

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

Это для поля. Для свойства измените type.GetField на type.GetProperty. Вы также можете получить доступ к закрытым методам аналогичным образом.

5 голосов
/ 10 марта 2009

Полагаю, кто-то должен спросить, хорошая ли это идея или нет? Это создает зависимость от частной реализации этого статического класса. Частная реализация может быть изменена без предварительного уведомления людей, использующих Reflection для доступа к частной реализации.

Если два класса предназначены для совместной работы, рассмотрите создание поля internal и добавление сборки взаимодействующего класса в атрибуте [assembly: InternalsVisibleTo].

2 голосов
/ 10 марта 2009

Как указано выше, вы, вероятно, можете использовать System.Type::GetMembers() с BindingFlags::NonPublic | BindingFlags::Static, но только если у вас есть право ReflectionPermission .

0 голосов
/ 10 марта 2009

Если у вас есть полное доверие, вы должны быть в состоянии:

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

Однако, если вы запустите это в системе без полного доверия, вызов GetField завершится ошибкой, и это не будет работать.

0 голосов
/ 10 марта 2009

Попробуйте что-то вроде этого:

Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);

Я бы подумал, что это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...