Могу ли я использовать VS2010 PrivateObject для доступа к статическому полю внутри статического класса? - PullRequest
18 голосов
/ 09 марта 2011

Можно ли получить доступ к закрытому статическому полю внутри статического класса, используя класс модульного теста VS2010 PrivateObject?

Допустим, у меня есть следующий класс:

public static class foo
{
    private static bar;
}

Могу ли я использовать PrivateObject для создания копии foo , а затем получить поле bar ?

Ответы [ 3 ]

30 голосов
/ 20 октября 2011

Класс PrivateType аналогичен классу PrivateObject для вызова закрытых статических членов. Могут использоваться перегруженные методы GetStaticFieldOrProperty. http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype(v=VS.100).aspx

7 голосов
/ 17 декабря 2013

Ответ Дипуна может быть очень полезным. Я хотел добавить конкретный пример, чтобы помочь людям, которые приходят сюда.

Класс с закрытым статическим членом.

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);

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

6 голосов
/ 09 марта 2011

Значение свойства можно получить с помощью отражения.Для этого потребуется использовать метод Type.GetField (String, BindingFlags) и метод FieldInfo.GetValue

string propertyName = "bar";
FieldInfo fieldInfo = typeof(foo).GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = fieldInfo.GetValue(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...