Отражение не извлекает значения из: Запечатанный класс, имеющий свойство, являющееся объектом другого запечатанного класса.

Я повторно оцениваю свойства посредством отражения, используя object.GetType (). GetProperty (string propertyName).

Это нормально работает, если объект имеет закрытый класс, но имеет свойство как объект обычного открытого класса. Однако, если это свойство содержит запечатанный объект класса, оно не возвращает никаких свойств через метод GetProperty ().

Попытка выполнить итерацию рекурсивно из объекта базового класса через Prpty1 -> Prpty2 -> Prpty3. param.Properties содержит массив строк для Prpty1, Prpty2, Prpty3. Не могу получить Prpty2, он идет как Null. Используя описанные ниже методы для этого доступа.

Пример кода выглядит следующим образом:

//Methods below are used to extract value from Object (basically BaseClass Object)

 private string EvaluateObject(object obj, MappedParameter param)
    {
        object evaluatedObj = obj;
        foreach (string s in param.Properties)
        {
            evaluatedObj = EvalProperty(evaluatedObj, s);
        }
        return (evaluatedObj == obj ? null : evaluatedObj.ToString());
    }

    private object EvalProperty(object obj, string propertyName)
    {
        System.Reflection.PropertyInfo propInfo = obj.GetType().GetProperty(propertyName);
        if (propInfo == null)
            throw new Exception("Invalid Property token");
        object propertyValue = propInfo.GetValue(obj, null);
        return propertyValue;
    }


//Below classes are Data Wrappers

 namespace TryClassLibrary
 {
 public class BaseClass
 {
    private NestedClass _Data = new NestedClass();    

    public NestedClass Prpty1
    {
        set { _Data = value; }
        get { return _Data; }
    }
}
}

 namespace TryClassLibrary
{
public sealed class NestedClass
{
    public int Id { get; set; }

    public NestedNestedClass Prpty2 = new NestedNestedClass();
}

public sealed class NestedNestedClass
{
    private string _Message;

    public NestedNestedClass()
    {
        Prpty3 = "Test value";
    }

    public string Prpty3
    {
        set
        {
            _Message = value;
        }
        get { return _Message; }
    }
}
}

Пожалуйста, может кто-нибудь помочь мне найти способ доступа к Prpty2, Prpty3 или это какое-то существующее ограничение при использовании отражения. Спасибо.


person Ashish Jain    schedule 13.06.2012    source источник
comment
У вас есть работоспособный пример этого? sealed не влияет на GetProperty никаким образом AFAIK. Я подозреваю, что проблема в другом - скорее всего, Type в какой-то момент запутался, и вы смотрите не на тот тип.   -  person Marc Gravell    schedule 13.06.2012
comment
Да, отметьте, я создал консольное приложение, которое тестирует это, и обнаружил, что объект NestedClass не может получить Prpty2 с помощью метода GetProperty (). Объект PropertyInfo получает значение Null.   -  person Ashish Jain    schedule 13.06.2012


Ответы (1)


Ах, проблема проста: Prpty2 не свойство: это поле:

public NestedNestedClass Prpty2 = new NestedNestedClass();

должно быть:

private readonly NestedNestedClass prpty2 = new NestedNestedClass();
public NestedNestedClass Prpty2 { get { return prpty2; } }

(или похожие)

Тогда все работает:

object obj = new BaseClass();
obj = obj.GetType().GetProperty("Prpty1").GetValue(obj, null);
obj = obj.GetType().GetProperty("Prpty2").GetValue(obj, null);
obj = obj.GetType().GetProperty("Prpty3").GetValue(obj, null);
string s = obj.ToString(); // "Test value"

Для информации, если вы делаете много этого - возможно, посмотрите FastMember; это более удобно и сильно оптимизировано, чтобы не платить налог на отражение.

person Marc Gravell    schedule 13.06.2012