web-dev-qa-db-ja.com

AutoMapperで条件付きマッピングを構成する方法は?

次のエンティティ(クラス)があるとします

public class Target
{
    public string Value;
}


public class Source
{
    public string Value1;
    public string Value2;
}

ここで、自動マップを構成して、Value1が「A」で始まる場合はValue1をValueにマップしますが、それ以外の場合はValue2をValueにマップします。

これは私がこれまでに持っているものです:

Mapper
    .CreateMap<Source,Target>()
    .ForMember(t => t.Value, 
        o => 
            {
                o.Condition(s => 
                    s.Value1.StartsWith("A"));
                o.MapFrom(s => s.Value1);
                  <<***But then how do I supply the negative clause!?***>>
            })

しかし、まだ私を避けている部分は、AutoMapperにgo take s.Value2前の条件が失敗した場合。

私には、APIが設計されていなかったように思えます...しかし、それは邪魔になる知識の不足かもしれません。

38
Alwyn

これを試して

 Mapper.CreateMap<Source, Target>()
        .ForMember(dest => dest.Value, 
                   opt => opt.MapFrom
                   (src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2));

条件オプションは、プロパティがマップされる前に満たす必要があるプロパティに条件を追加するために使用され、MapFromオプションは、カスタムのソース/宛先メンバーマッピングを実行するために使用されます。

88
Tejal

条件付きマッピングを使用すると、指定した宛先プロパティに対してマッピングを実行するタイミングのみを構成できます。

したがって、同じ宛先プロパティに対して異なる条件で2つのマッピングを定義することはできません。

「条件がtrueの場合はPropertyAを使用し、そうでない場合はPropertyBを使用する」などの条件がある場合は、「Tejal」が書いたように実行する必要があります。

opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)
3
Marcus.D

AutoMapperでは、プロパティをマップする前に満たす必要があるプロパティに条件を追加できます。

私はいくつかの列挙条件を使用してマッピングを行っていましたが、私の側からのコミュニティにとってはほとんど労力のない外観です。

}

.ForMember(dest => dest.CurrentOrientationName, 
             opts => opts.MapFrom(src => src.IsLandscape? 
                                        PageSetupEditorOrientationViewModel.Orientation.Landscape : 
                                        PageSetupEditorOrientationViewModel.Orientation.Portrait));
2
Khawaja Asim