使用反射嵌套的完全限定属性名称

时间:2016-09-02 15:36:00

标签: c# .net reflection

我有以下课程:

public class Car
{
    public Engine Engine { get; set; }    
    public int Year { get; set; }        
}

public class Engine 
{
    public int HorsePower { get; set; }
    public int Torque { get; set; } 
}

我使用以下方法获取所有嵌套属性:

var result = typeof(Car).GetProperties(BindingFlags.Public | BindingFlags.Instance).SelectMany(GetProperties).ToList();

        private static IEnumerable<PropertyInfo> GetProperties(PropertyInfo propertyInfo)
        {
            if (propertyInfo.PropertyType.IsClass)
            {
                return propertyInfo.PropertyType.GetProperties().SelectMany(prop => GetProperties(prop)).ToList();
            }

            return new [] { propertyInfo };
        }

这给了我班级的所有属性。但是,当我尝试从对象获取嵌套属性时,我得到一个异常:

horsePowerProperty.GetValue(myCar); // object doesn't match target type exception

这是因为它无法在HorsePower对象上找到属性Car。我查看了PropertyInfo上的所有属性,但似乎找不到具有完全限定属性名称的任何地方。然后我会用它来分割字符串,并递归地从Car对象中获取属性。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

(尚未对此进行测试)

您可以使用MemberInfo.DeclaringType

private static object GetPropertyValue(PropertyInfo property, object instance)
{
    Type root = instance.GetType();
    if (property.DeclaringType == root)
        return property.GetValue(instance);
    object subInstance = root.GetProperty(property.DeclaringType.Name).GetValue(instance);
    return GetPropertyValue(property, subInstance);
}

这要求如果HorsePower属于Engine类型,则您需要在Engine类型中设置名为Car的媒体资源。