2015-12-21 208 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)); 

這是一個少一點的代碼,並具有動態指定字段的優勢。