Есть ли способ получить значение частного статического поля из известного класса с использованием отражения?
Как получить значение частного статического поля из класса?
Ответ 1
Да.
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
Это поле. Для свойства измените type.GetField
на type.GetProperty
. Вы также можете получить доступ к приватным методам аналогичным образом.
Ответ 2
Я полагаю, кто-то должен спросить, хорошая ли это идея или нет? Это создает зависимость от частной реализации этого статического класса. Частная реализация может быть изменена без уведомления, предоставленного людям, использующим Reflection, для доступа к частной реализации.
Если два класса предназначены для совместной работы, подумайте о том, чтобы сделать внутреннее поле и добавить сборку взаимодействующего класса в атрибут [assembly: InternalsVisibleTo].
Ответ 3
Как указано выше, вы можете использовать System.Type::GetMembers()
с BindingFlags
::NonPublic | BindingFlags::Static
, но только если у вас есть право ReflectionPermission
.
Ответ 4
Если у вас есть полное доверие, вы должны уметь:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
Однако, если вы запустите это в системе без полного доверия, вызов GetField завершится неудачно, и это не сработает.
Ответ 5
Попробуйте что-то вроде этого:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
Я думаю, что это должно сработать.