C# 将具有属性的列表映射到对象C
我想知道如何将包含属性的“keyvaluepair”列表映射到对象。 如果能和AutoMapper一起解决这个问题会很好,但是任何建议都会很好 下面是我希望它如何处理获得属性的FooBar,以及根据与FooBar属性匹配的属性应映射的键/值列表:C# 将具有属性的列表映射到对象C,c#,map,automapper,C#,Map,Automapper,我想知道如何将包含属性的“keyvaluepair”列表映射到对象。 如果能和AutoMapper一起解决这个问题会很好,但是任何建议都会很好 下面是我希望它如何处理获得属性的FooBar,以及根据与FooBar属性匹配的属性应映射的键/值列表: // AutoMapper var mappedFooBar = Mapper.Map<IEnumerable<KeyValuePair<string, object>> FooBar>(fooBar); 我已经为
// AutoMapper
var mappedFooBar = Mapper.Map<IEnumerable<KeyValuePair<string, object>> FooBar>(fooBar);
我已经为此挣扎了一段时间,所以任何建议都是很好的。
也尝试用反射贴图,但似乎无法使其工作
提前感谢。这里是一个简单、直接的反射解决方案。它不进行类型检查等,但可以轻松内置:
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将有助于提高性能。我认为AutoMapper在这方面没有太多帮助。您可以为它编写一个自定义的ITypeConverter,但这仍然意味着您需要自己提供大部分实现。谢谢您的建议!谢谢你,这正是我需要的!