39

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

たとえば、次の場合:

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つの異なるビューモデルを使用し、それぞれに異なるマッピングを作成することです。

4

3 に答える 3

56

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

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

Mapper.CreateMap<CarViewModel, Car>()
 .ForMember(dest => dest.Code, opt => opt.Condition(source => source.Id != 0))
于 2010-03-16T12:47:44.953 に答える
6

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

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

于 2011-04-28T23:18:10.877 に答える
0

条件付きマッピングのドキュメントは次のとおりです。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))
于 2019-04-16T13:48:21.260 に答える