使用反射的复合类成员的值

本文关键字:成员 复合 反射的 | 更新日期: 2023-09-27 18:33:08

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

class X
{
    public string str;
}
class Y
{
    public X x;
}

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

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

使用反射的复合类成员的值

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

,这是行不通的。你需要获取属性x,获取其类型,然后获取该其他类型的属性:

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

当然,要使其正常工作,您需要创建xstr属性,而不是字段。这是关于 ideone 的演示。

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

那是因为GetNestedType给你一个在Y内部定义的类型,像这样:

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

使用嵌套属性类型:

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

可以使用表达式树静态检索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;
    }
}