Можно ли использовать VS2010 PrivateObject для доступа к статическому полю внутри статического класса?
Возможно ли получить доступ к приватному статическому полю внутри статического класса, используя класс VS2010 Unit Test privateObject?
Скажем, у меня есть следующий класс:
public static class foo
{
private static bar;
}
Могу ли я использовать PrivateObject для создания копии foo, а затем получить поле bar?
Ответы
Ответ 1
Значение свойства может быть восстановлено с использованием отражения. Это потребует использования метода Type.GetField(String, BindingFlags) и Метод FieldInfo.GetValue
string propertyName = "bar";
FieldInfo fieldInfo = typeof(foo).GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = fieldInfo.GetValue(null);
Ответ 2
Класс PrivateType аналогичен PrivateObject для вызова частных статических членов. Могут использоваться перегруженные методы GetStaticFieldOrProperty.
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype(v=VS.100).aspx
Ответ 3
Ответ Deepun может быть очень полезен. Я хотел добавить конкретный пример, чтобы помочь людям, которые приходят сюда.
Класс с частным статическим членом.
public class foo
{
private static int bar;
}
Код для получения значения.
PrivateType pt = new PrivateType(typeof(foo));
int bar = (int)pt.GetStaticFieldOrProperty("bar");
Код для изменения значения
PrivateType pt = new PrivateType(typeof(foo));
pt.SetStaticFieldOrProperty("bar", 10);
Это будет работать независимо от того, какой класс статичен или нет.