我想知道如何使用'keyvaluepair'将包含属性的列表映射到对象。 用AutoMapper解决它会很好,但任何建议都会非常友好。
以下是我希望如何使用FooBar获取属性以及应根据与FooBars属性匹配的属性映射的键/值列表:
// AutoMapper
var mappedFooBar = Mapper.Map<IEnumerable<KeyValuePair<string, object>> FooBar>(fooBar);
我一直在努力解决这个问题,所以任何建议都会很好。 也尝试用反射进行映射,但似乎无法让它起作用。
提前致谢。
答案 0 :(得分:1)
这是一个简单,直接的反射解决方案。它不进行类型检查等,但它可以很容易地构建:
public void Map(IEnumerable<KeyValuePair<string,object>> data, object target)
{
Type t = target.GetType();
var publicProperties = t.GetProperties();
var setters = from kp in data
let prop = publicProperties.SingleOrDefault(p => p.Name == kp.Key)
where prop != null && prop.CanWrite
select new { prop, kp.Value };
foreach(var setter in setters)
{
setter.prop.SetValue(target, setter.Value, null);
}
}
当然,您可以创建一个使用它的AutoMapper ITypeConverter
。如果您已经使用了AutoMapper,那么保持代码一致可能是个好主意。
请注意,这种反射技术可能会很慢 - 如果您需要经常映射,请按类型缓存已解析的setter将有利于提高性能。