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

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

В моей конфигурации у меня есть нечто похожее:

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

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

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

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

Ответ 1

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

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>.

Ответ 2

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

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

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