web-dev-qa-db-ja.com

オートマッパー:の条件で無視

ソースプロパティの値に応じて、メンバーのマッピングを無視することはできますか?

たとえば、次の場合です。

public class Car
{
    public int Id { get; set; }
    public string Code { get; set; }
}

public class CarViewModel
{
    public int Id { get; set; }
    public string Code { get; set; }
}

私はのようなものを探しています

Mapper.CreateMap<CarViewModel, Car>()
      .ForMember(dest => dest.Code, 
      opt => opt.Ignore().If(source => source.Id == 0))

これまでのところ、私が持っている唯一の解決策は、2つの異なるビューモデルを使用し、それぞれに異なるマッピングを作成することです。

35
Castrohenge

Ignore()機能は、マップすることのないメンバー専用です。これらのメンバーも構成の検証でスキップされるためです。いくつかのオプションを確認しましたが、カスタム値リゾルバーがうまくいくようには見えません。

Condition() 機能を使用して、条件がtrueの場合にメンバーをマップします。

Mapper.CreateMap<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id != 0))
50
Jimmy Bogard

同様の問題が発生しました。これにより、_dest.Code_の既存の値がnullで上書きされますが、開始点として役立つ場合があります。

AutoMapper.Mapper.CreateMap().ForMember(dest => dest.Code,config => config.MapFrom(source => source.Id != 0 ? null : source.Code));

6
jbehren

条件付きマッピングのドキュメントは次のとおりです。 http://docs.automapper.org/en/latest/Conditional-mapping.html

PreConditionと呼ばれる別のメソッドもあります。これは、マッピングプロセスでソース値が解決される前に実行されるため、特定のシナリオで非常に役立ちます。

Mapper.PreCondition<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id == 0))
0
lisandro101