我如何配置映射器,以使其正常工作?
(即动态对象的属性应映射到具有相同字母的类定义的属性-忽略大小写)
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic fooDyn = new MyDynamicObject();
fooDyn.baR = 5;
fooDyn.bAz = 6;
Mapper.Initialize(cfg => {});
Foo result = Mapper.Map<Foo>(fooDyn);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
答案 0 :(得分:1)
如果您的动态对象实现了IDictionary<string,object>
(例如ExpandoObject
),则以下内容应该可以工作。必须有一些更简便的方法,因为即使大小写不同,匿名对象也可以很好地映射。
Mapper.Initialize(cfg =>
{
cfg.CreateMap<IDictionary<string, object>, Foo>()
.ConstructUsing(d =>
{
Foo foo = new Foo();
foreach (System.Reflection.PropertyInfo prop in typeof(Foo).GetProperties())
{
foreach (KeyValuePair<string, object> entry in d)
{
if (entry.Key.ToLowerInvariant() == prop.Name.ToLowerInvariant())
{
prop.SetValue(foo, entry.Value);
break;
}
}
}
return foo;
});
});
答案 1 :(得分:0)
AutoMapper允许您以这种样式在地图配置上配置显式成员映射:
var config = new MapperConfiguration(cfg =>
{
var dynamicMap = cfg.CreateMap<IDictionary<string, object>, SomethingDTO>();
dynamicMap.ForAllMembers((expression) => expression.MapFrom(source =>
source.ContainsKey(expression.DestinationMember.Name.Substring(0, 1).ToLower()
+ expression.DestinationMember.Name.Substring(1))
? source[expression.DestinationMember.Name.Substring(0, 1).ToLower()
+ expression.DestinationMember.Name.Substring(1)] : null
));
});
要将动态/扩展对象(驼峰式案例)映射到带有pascal案例成员的类型,可以在显式地图配置上使用ForAllMembers。可能的用例:DTO的json负载。
与其他答案(也有效)相比,该方法使您可以继续受益并使用所有其他地图功能和配置。