Можно ли использовать 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);

Ответ 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);

Это будет работать независимо от того, какой класс статичен или нет.