反射不从以下值中提取值:具有属性的密封类,该属性是另一个密封类的对象。

时间:2012-06-13 07:25:40

标签: c# reflection sealed

我通过使用object.GetType()。GetProperty(string propertyName)来反射评估属性。

如果obj是密封类但具有属性作为普通公共类的对象,这是正常的。但是,如果此属性包含密封的类对象,则它不会通过GetProperty()方法返回任何属性。

尝试通过Prpty1 - > Prpty2 - > Prpty3从Baseclass对象递归迭代。 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的方法,或者是使用反射时的一些现有约束。感谢。

1 个答案:

答案 0 :(得分:2)

啊,问题很简单: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;它更方便,并且经过大量优化,因此不需要支付反思税。