2016-09-08 15 views
1

私は以下のコードを持っています。
すべてのフィールドは、送信元オブジェクトから送信先オブジェクトにうまくマッピングされます。
しかし、私が計算する必要がある宛先オブジェクトには1つのフィールドがあります。AutoMapperでカスタムロジックを追加するにはどうすればよいですか?

たとえば、 DestinationObj.Statusは、sourceobjの特定のフィールドに応じて設定できます。

私はコードを書くとしたら、それはのようになります。私はAutoMapperに似た何かを行うことができます

 foreach (var rec in listData) 
     { 
      string status; 

      if (!String.IsNullOrEmpty(rec.Field1)) 
      { 
       status = "Stage 1"; 
      } 
      if (!String.IsNullOrEmpty(rec.Field2)) 
      { 
       status = "Stage 2"; 
      } 
      if (!String.IsNullOrEmpty(rec.Field3)) 
      { 
       status = "Stage 3"; 
      } 

     } 

 var config = new MapperConfiguration(c => 
     { 
      c.CreateMap<SourceObj, DestinationObj>() 
       .ForMember(x => x.Status, m => m.MapFrom([Not sure at this point ])); 

     }); 

EDIT: 一覧destinObj =新しいリスト();

foreach (var rec in listSourceObject) 
      { 
       destinationObj do = new destinationObj(); 
       // Manually map all of the fields... 


       string status; 

       if (!String.IsNullOrEmpty(rec.Field1)) 
       { 
        do.status = "Stage 1"; 
       } 
       if (!String.IsNullOrEmpty(rec.Field2)) 
       { 
        do.status = "Stage 2"; 
       } 
       if (!String.IsNullOrEmpty(rec.Field3)) 
       { 
        do. status = "Stage 3"; 
       } 
       destinObj.Add(do); 
      } 
+1

'listData'はどこから来たのですか? 「ステータス」はどこに行くのですか?適用するメソッドは、マッピングにはまったく関係していません。 – krillgar

+0

編集時にコードを整理しました。 – PrivateJoker

+0

まだ明らかではありません。両方のオブジェクトは自分自身のコレクションですか? – krillgar

答えて

2

これを行う最も簡単な方法は、メソッドをマッパークラスに移動することです。 .MapFrom()内のそのメソッドにアクセスできます。

var config = new MapperConfiguration(c => 
{ 
    c.CreateMap<SourceObj, DestinationObj>() 
     .ForMember(x => x.Status, m => m.MapFrom(src => MapStatus(src)); 

}); 

private string MapStatus(SourceObject source) 
{ 
    // Whatever that foreach loop actually does. 
} 
3

MapFrom()の推奨解決策と回避策は完全に正しくありません。 MapFrom()AutoMapper: What is the difference between MapFrom and ResolveUsing?として示唆)はスマートなので、入れ子になったPropertyExpressionを処理できます。マッピング値のための定期的な機能を処理するために

あなたはコードを直接入力することができますし、Expression<Func<>>として表現することへの呼び出しを変更する必要はありませんので、あなたは、Func<>を受け入れる、ResolveUsing()を使用する必要があります。

関連する問題