web-dev-qa-db-ja.com

2つのオブジェクトをマージしてAutomapperを使用して3番目のものを生成します

私はそれが automapper そしてAuthomerge(R)ではありませんが...

私はAutomapperを使い始め、A - > Bをマッピングし、Cからいくつかのプロパティを追加して、Bが+ Cの一種のフラットコンポジットになるようにCからいくつかのプロパティを追加する必要があります。

これは、automapperを使用して、重いリフティングを行うだけで、余分なプロパティを手動でマッピングする必要がありますか?

26
Jason Hyland

私はハードと長いこの質問で検索し、一緒にマージのオブジェクトその拡張メソッドを実装することになりました。

私は私のブログ上の手順を参照 http://twistyvortek.blogspot.com 、ここでは、コードは次のとおりです。

【.____。] [.____。】システムを使用して、[。____] [。____]名前空間Domain.Models 
 {[.____。】パブリック静的クラスExtendedMethods 
 {[。 ____] /// <概要> 
 ///マージ2つのオブジェクトインスタンス一緒。プライマリ・インスタンスは、すべての非NULL値を保持し、第二は、ヌル特性マッププライマリ
 /// </要約> 
 /// <typeparam名=」すべてのプロパティをマージしますマージオブジェクトのT ">タイプパラメータ。両方のオブジェクトが同じタイプである必要があります。</ typeparam> 
 /// <PARAM NAME = "プライマリ">(変性)、マージデータを受信して​​いるオブジェクト</ PARAM> 
 ///<PARAM NAME =「二次」>マージプロパティを供給するオブジェクト。 (未修飾)</ PARAM> 
 /// <戻る>(変性)プライマリオブジェクト</戻り> [.____。】パブリック静的T MergeWith <T>(Tこの一次、二次T)。 。。____] {[.____] foreachの(typeof演算におけるVARのPI(T).GetProperties())[.____] {[.____] VAR priValue = pi.GetGetMethod()を呼び出す(一次、NULL)。。。。 【。____] VAR secValue = pi.GetGetMethod()を呼び出す(二次、NULL); 
(priValue == NULL ||(pi.PropertyType.IsValueType && priValue == Activator.CreateInstance(PI場合。 PropertyTypeは)))
 {
 pi.GetSetMethod()を呼び出す(一次、新しい[] {secValue}); [.____]} 
} [.____。】次戻り; .____。]} 
} 
} 
 [.____。】

あなたが一つに複数のオブジェクトをマージすることができますので、使い方はメソッドチェーンを含んでいます。

私は何だろうことなど、のDTOの同じクラスにあなたのさまざまなソースからのプロパティの一部をマッピングして、それらを一緒にマージするために、この拡張メソッドを使用するために使用automapperです。

【.____。] [.____。】VAR Obj1と= Mapper.Map(インスタンス1); [.____。】VAR OBJ2 = Mapper.Map(インスタンス2); [.____。】VAR OBJ3 = Mapper.Map(インスタンス3)。 VAR OBJ4 = Mapper.Map(Instance4).____。]; [.____] [。____] VAR finalMerge = Obj1.MergeWith(OBJ2).____。】.MergeWith(OBJ3).____。]。 MergeWith(OBJ4); 
 [.____。】

これは誰かに役立ちます願っています。

5
The Prophet