Automapper:将参数传递给Map方法
我在我的项目中使用Automapper,我需要动态地确定目标对象的字段。Automapper:将参数传递给Map方法
在我的配置我有类似的东西:
cfg.CreateMap<Message, MessageDto>()
// ...
.ForMember(dest => dest.Timestamp, opt => opt.MapFrom(src => src.SentTime.AddMinutes(someValue)))
//...
;
在配置代码的someValue
是,我需要在运行时传递给映射器,而不是源对象的场的参数。
有没有办法做到这一点?事情是这样的:
Mapper.Map<MessageDto>(msg, someValue));
你不能做你想要什么,但你可以通过指定映射选项,当你调用地图八九不离十。忽略的财产在你的配置:
cfg.CreateMap<Message, MessageDto>()
.ForMember(dest => dest.Timestamp, opt => opt.Ignore())
;
然后传递选项,当你打电话给你的地图:
int someValue = 5;
var dto = Mapper.Map<Message, MessageDto>(message, opt =>
opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue)));
请注意,您需要使用Mapper.Map<TSrc, TDest>
超负荷使用此语法。
完美,这正是我需要的!谢谢! – davioooh
不会在这种情况下更容易,而不是AfterMap只分配dto.TimeStamp = message.SendTime.AddMinutes(someValue); –
此解决方案仅适用于平面映射,就好像映射不能像这样手动管理这些对象的树一起使用......“opt.AfterMap”代码会与您在项目中映射对象的时间相乘,很难在一个位置进行管理和修复,除非您封装了您的整个地图功能。 –
使用Map方法的另一种可能的选择是使用Items字典。例如:
int someValue = 5;
var dto = Mapper.Map<Message>(message,
opts => opts.Items["Timestamp"] = message.SentTime.AddMinutes(someValue));
这是一个少一点的代码,并具有动态指定字段的优势。
这可能有所帮助:https://*.com/questions/31748671/pass-objects-to-automapper-mapping –
适当使用增值的最高分。 – TheDude