扩展方法将对象属性映射到IDictionary的最有效方法是什么:
使用反射是最好的方法吗?有例子吗?
谢谢Z..。
澄清最新情况
"ParentCompany.BillingAddress"字典键应该是基于属性名称的路径,而不是hierarchy.So类型,如果客户有属性public Company ParentCompany
,而公司有属性public Address BillingAddress
,那么键路径应该是public Company ParentCompany
发布于 2012-06-07 16:21:56
编辑:
public static IDictionary<string, string> GetProperties<T>(this T obj)
where T : class
{
var properties = obj.GetPropertyList();
return properties.ToDictionary(prop => prop.Item1, prop => prop.Item2);
}
public static IEnumerable<Tuple<string, string>> GetPropertyList<T>(this T obj)
where T : class
{
if (obj == null)
throw new ArgumentNullException("obj");
Type t = obj.GetType();
return GetProperties(obj, t, t.Name);
}
private static IEnumerable<Tuple<string, string>> GetProperties(object obj, Type objType, string propertyPath)
{
// If atomic property, return property value with path to property
if (objType.IsValueType || objType.Equals(typeof(string)))
return Enumerable.Repeat(Tuple.Create(propertyPath, obj.ToString()), 1);
else
{
// Return empty value for null values
if (obj == null)
return Enumerable.Repeat(Tuple.Create(propertyPath, string.Empty), 1);
else
{
// Recursively examine properties; add properties to property path
return from prop in objType.GetProperties()
where prop.CanRead && !prop.GetIndexParameters().Any()
let propValue = prop.GetValue(obj, null)
let propType = prop.PropertyType
from nameValPair in GetProperties(propValue, propType, string.Format("{0}.{1}", propertyPath, prop.Name))
select nameValPair;
}
}
}
这仍然不能处理值参数的默认值。注意,何时停止递归迭代的逻辑是关键。最初,我停止使用值类型的属性,但这意味着字符串与其他对象一样被处理。因此,我添加了一个特例,将字符串视为原子类型。
https://stackoverflow.com/questions/10935291
复制相似问题