使用Reflection的复合类成员的值

时间:2013-09-29 09:53:47

标签: c# reflection

我有一个由多个其他类组成的类。

class X
{
    public string str;
}

class Y
{
    public X x;
}

现在我知道使用反射你可以得到class Y的直接成员的值,但我怀疑是否使用反射,我可以得到复合类成员的值,即str吗?像y.GetType().GetProperty("x.str")

这样的东西

我也试过了y.GetType().GetNestedType("X"),但是它输出为null。

3 个答案:

答案 0 :(得分:1)

  

y.GetType().GetProperty("x.str")

这样的东西

不,这不会起作用。您需要获取属性xget its type,然后获取其他类型的属性:

y.GetType().GetProperty("x").PropertyType.GetProperty("str");

当然,为了实现这一目标,您需要制作xstr属性,而不是字段。这是demo on ideone

  

我也试过了y.GetType().GetNestedType("X"),但是它输出为null。

这是因为GetNestedType为您提供了Y内定义的类型,如下所示:

class Y {
    class X { // <<= This is a nested type
        ...
    }
    ...
}

答案 1 :(得分:0)

您使用嵌套属性类型:

y.x.GetType().GetProperty("str").GetValue(y.x)

答案 2 :(得分:0)

您可以使用表达式树来静态检索PropertyInfo。这也有不使用字符串的优点,这支持更容易的重构。

ExpressionHelper.GetProperty(() => y.x.str);

public static class ExpressionHelper
{
    public static PropertyInfo GetProperty<T>(Expression<Func<T>> expression)
    {
        if (expression == null) throw new ArgumentNullException("expression");

        PropertyInfo property = null;
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression != null)
        {
            property = memberExpression.Member as PropertyInfo;
        }

        if (property == null) throw new ArgumentException("Expression does not contain a property accessor", "expression");

        return property;
    }
}