簡體   English   中英

來自多個源字段的自動映射器條件 map

[英]Automapper conditional map from multiple source fields

我有一個源 class ,如下所示:

public class Source
{
    public Field[] Fields { get; set; }
    public Result[] Results { get; set; }
}

並有一個目的地 class 像:

public class Destination
{
    public Value[] Values { get; set; }
}

所以我想從FieldsResultsValues的 map 取決於哪個不是 null (只有一個會有值)。

我嘗試了以下 map:

CreateMap<Fields, Values>();                
CreateMap<Results, Values>();                

CreateMap<Source, Destination>()                
            .ForMember(d => d.Values, opt =>
            {
                opt.PreCondition(s => s.Fields != null);
                opt.MapFrom(s => s.Fields });
            })
            .ForMember(d => d.Values, opt =>
            {
                opt.PreCondition(s => s.Results != null);
                opt.MapFrom(s => s.Results);
            });

唯一的問題是,如果最后一個.ForMember map 不滿足從第一個 map 清除映射結果的條件。

我還考慮過將其作為條件運算符:

opt => opt.MapFrom(s => s.Fields?= null. s:Fields. s.Results)

但顯然它們是不同的類型,所以不要編譯。

如何根據條件從不同類型的源屬性 map 到單個屬性?

謝謝

有一個ResolveUsing()方法允許您進行更復雜的綁定,您可以使用IValueResolverFunc 像這樣的東西:

CreateMap<Source, Destination>()
    .ForMember(dest => dest.Values, mo => mo.ResolveUsing<ConditionalSourceValueResolver>());

根據您的需要,值解析器可能如下所示:

 public class ConditionalSourceValueResolver : IValueResolver<Source, Destination, Value[]>
    {
        public Value[] Resolve(Source source, Destination destination, Value[] destMember, ResolutionContext context)
        {
            if (source.Fields == null)
                return context.Mapper.Map<Value[]>(source.Results);
            else
                return context.Mapper.Map<Value[]>(source.Fields);
        }
    }

按照@animalito_maquina回答

這是8.0 升級的更新:

CreateMap<Source, Destination>()
    .ForMember(dest => dest.Values, mo => mo.MapFrom<ConditionalSourceValueResolver>());

為了節省您的時間,可查詢擴展不支持ValueResolvers

ResolveUsing 不可用,試試這個。 它對我有用

CreateMap<Source, Destination>()   
.ForMember(opt => opt.value, map => 
map.MapFrom((s, Ariel) => s.Fields != null ? s.Fields : s.Results));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM