Automapper: передача параметра в метод Map

Я использую Automapper в проект и мне нужно динамически оценить поля моего объекта назначения.

в моей конфигурации у меня есть что-то подобное:

cfg.CreateMap<Message, MessageDto>()
    // ...
    .ForMember(dest => dest.Timestamp, opt => opt.MapFrom(src => src.SentTime.AddMinutes(someValue)))
    //...
    ;

на someValue в коде конфигурации есть параметр, который мне нужно передать во время выполнения в mapper и не является полем исходного объекта.

есть ли способ достичь этого? Что-то вроде этого:--6-->

Mapper.Map<MessageDto>(msg, someValue));

2 ответов


вы не можете делать именно то, что хотите, но вы можете получить довольно близко, указав параметры отображения при вызове Map. Игнорируйте свойство в конфигурации:

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> перегрузка для использования этого синтаксиса.


другим возможным вариантом при использовании метода Map будет использование словаря элементов. Пример:

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

Это немного меньше кода и имеет преимущество динамически указанных полей.