web-dev-qa-db-ja.com

Automapper:Mapメソッドにパラメーターを渡す

プロジェクトで Automapper を使用しているため、宛先オブジェクトのフィールドを動的に有効化する必要があります。

私の構成では、似たようなものがあります:

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

構成コードのsomeValueは、実行時にマッパーに渡す必要があるパラメーターであり、ソースオブジェクトのフィールドではありません。

これを達成する方法はありますか?このようなもの:

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

あなたが望むことを正確に行うことはできませんが、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>オーバーロードを使用する必要があることに注意してください。

46
Richard

Mapメソッドの使用中に考えられる別のオプションは、Itemsディクショナリの使用です。例:

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

コードが少し少なく、動的に指定されたフィールドの利点があります。

8
Sven