我有以下课程:
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
对象中获取属性。
任何帮助都将不胜感激。
答案 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
的媒体资源。