Использование Reflection для установки значения статической переменной перед инициализацией объекта?

Можно ли вообще установить значение статической (частной) переменной для объекта, который не был инициализирован? Для метода SetValue требуется экземпляр, но я надеюсь, что есть способ обойти это.


person Chance    schedule 04.02.2010    source источник


Ответы (2)


Для статических значений вы можете передать null для параметра экземпляра.

var type = typeof(SomeClass);
var field = type.GetField("SomeField", BindingFlags.NonPublic | BindingFlags.Static);
field.SetValue(null, 42);
person JaredPar    schedule 04.02.2010
comment
+1 увлекательно: то, что я нахожу немного пугающим в этой технике, это: если рассматриваемое поле доступно только для чтения: этот код не вызовет ошибку времени выполнения при выполнении. - person BillW; 05.02.2010
comment
Если рассматриваемое поле доступно только для чтения, оно просто ничего не делает? Или он все равно устанавливает значение? Это всего лишь .NET 3.5? - person J.Hendrix; 05.02.2010
comment
+1. Я думаю, что для частной статики вам нужны BindingFlags в качестве второго параметра метода GetField. BindingFlags.Static | BindingFlags.NonPublic - person user420667; 07.03.2014

не могли бы вы создать статическую функцию, которая является общедоступной, и использовать ее для установки вашей частной статической переменной?

person John Boker    schedule 04.02.2010
comment
Я предполагаю, что это против типа, для которого у @Chance нет исходного кода. - person Randolpho; 05.02.2010
comment
Да, я не могу возиться с исходным кодом, и, к сожалению, я заблокирован в 2.0 без методов расширения. Спасибо хоть! - person Chance; 05.02.2010
comment
Методы расширения не могут получить доступ к закрытым данным. msdn.microsoft.com/en-us/library/bb383977.aspx - person Steve Guidi; 05.02.2010