ソースプロパティの値に応じて、メンバーのマッピングを無視することはできますか?
たとえば、次の場合です。
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つの異なるビューモデルを使用し、それぞれに異なるマッピングを作成することです。
Ignore()機能は、マップすることのないメンバー専用です。これらのメンバーも構成の検証でスキップされるためです。いくつかのオプションを確認しましたが、カスタム値リゾルバーがうまくいくようには見えません。
Condition() 機能を使用して、条件がtrueの場合にメンバーをマップします。
Mapper.CreateMap<CarViewModel, Car>()
.ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id != 0))
同様の問題が発生しました。これにより、_dest.Code
_の既存の値がnullで上書きされますが、開始点として役立つ場合があります。
AutoMapper.Mapper.CreateMap().ForMember(dest => dest.Code,config => config.MapFrom(source => source.Id != 0 ? null : source.Code));
条件付きマッピングのドキュメントは次のとおりです。 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))