我有一个如下所示的源类:
public class Source
{
public Field[] Fields { get; set; }
public Result[] Results { get; set; }
}
并有一个目标类,例如:
public class Destination
{
public Value[] Values { get; set; }
}
所以我想从任一地图Fields
or Results
to Values
取决于哪一个不为空(只有一个具有值)。
我尝试了以下地图:
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
地图不满足条件,它会清除第一个地图中的映射结果。
我还考虑过将其作为条件运算符:
opt => opt.MapFrom(s => s.Fields != null ? s.Fields : s.Results)
但显然它们是不同的类型,所以不要编译。
如何根据条件从不同类型的源属性映射到单个属性?
Thanks
有一个ResolveUsing()
方法允许您进行更复杂的绑定,您可以使用IValueResolver
or a 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)