[英]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; }
}
所以我想從Fields
或Results
到Values
的 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()
方法允許您進行更復雜的綁定,您可以使用IValueResolver
或Func
。 像這樣的東西:
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);
}
}
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.