Получение значения AutoProperty, у которого нет метода получения, с помощью PropertyInfo.GetValue - PullRequest
0 голосов
/ 11 февраля 2011

Я пытаюсь получить значение строкового свойства в модульном тесте. Проблема в том, что в собственности нет добытчика. Свойство также объявляется как AutoProperty и не имеет вспомогательного поля.

Я пытаюсь использовать PropertyInfo.GetValue (...) в пространстве имен System.Reflection. Однако я получаю System.ArgumentException: метод Get свойства не найден.

Мне не принадлежит код этого типа, поэтому я не могу добавить геттер к свойству.

Как получить стоимость такого имущества?

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Вам нужно как-то найти поле поддержки, которое было автоматически сгенерировано компилятором с помощью Reflection. И тогда, используя FieldInfo, вы сможете прочитать его значение. И я не уверен, возможно ли это вообще.

ОК, у меня есть решение:

со следующим классом,

public class TestClass
{
    public String TestProperty { private get; set; }
}

и следующий метод расширения,

public static class ObjectExtensions
{
    public static Object GetPropertyValue(this Object obj, String propertyName)
    {
        if (obj == null) throw new ArgumentNullException("obj", "`obj` cannot be null");

        var fields = from f in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
                     where f.Name.Contains(String.Format("<{0}>", propertyName))
                     select f;

        if (fields.Any())
        {
            return fields.First().GetValue(obj);
        }

        return null;
    }
}

Вы можете достичь желаемого, используя следующий код:

TestClass obj = new TestClass() { TestProperty = "Test Value" };
Object value = obj.GetPropertyValue("TestProperty"); // value = "Test Value"
0 голосов
/ 11 февраля 2011

Свойство будет иметь вспомогательное поле, просто мы не знаем его имени (и это имя не будет допустимым идентификатором).Если это для одноразовой задачи, то вам лучше всего взломать ее, используя .NET рефлектор и найти поле, которое устанавливается установщиком.

Я неЯ думаю, что с помощью Reflection можно сделать все, что угодно (если только вы не хотите проанализировать тело метода IL установщика, чтобы найти поле, которое оно устанавливает

...