2015-12-21 211 views
12

我在我的项目中使用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)); 
+0

这可能有所帮助:https://stackoverflow.com/questions/31748671/pass-objects-to-automapper-mapping –

+0

适当使用增值的最高分。 – TheDude

回答

23

你不能做你想要什么,但你可以通过指定映射选项,当你调用地图八九不离十。忽略的财产在你的配置:

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>超负荷使用此语法。

+0

完美,这正是我需要的!谢谢! – davioooh

+4

不会在这种情况下更容易,而不是AfterMap只分配dto.TimeStamp = message.SendTime.AddMinutes(someValue); –

+0

此解决方案仅适用于平面映射,就好像映射不能像这样手动管理这些对象的树一起使用......“opt.AfterMap”代码会与您在项目中映射对象的时间相乘,很难在一个位置进行管理和修复,除非您封装了您的整个地图功能。 –

2

使用Map方法的另一种可能的选择是使用Items字典。例如:

int someValue = 5; 
var dto = Mapper.Map<Message>(message, 
    opts => opts.Items["Timestamp"] = message.SentTime.AddMinutes(someValue)); 

这是一个少一点的代码,并具有动态指定字段的优势。