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

は、次にオプションで渡す:あなたはこの構文を使用するMapper.Map<TSrc, TDest>オーバーロードを使用する必要が

int someValue = 5; 
var dto = Mapper.Map<Message, MessageDto>(message, opt => 
    opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue))); 

注意。

+0

パーフェクト、これは私が必要とするものです!ありがとう! – davioooh

+4

この場合、AfterMapの代わりにdto.TimeStamp = message.SendTime.AddMinutes(someValue);を代入するほうが簡単でしょう。 –

+0

このソリューションは、このように手動でこれを管理できないオブジェクトのツリーをマップするかのようにフラットマッピングでのみ機能します... "opt.AfterMap"コードにプロジェクト内のオブジェクトをマップする時間を乗算し、マップ機能全体をカプセル化しない限り、1か所で管理して修正するのは難しいです。 –

2

Mapメソッドを使用する際には、アイテム辞書を使用することもできます。例:

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

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

関連する問題