使用AutoMapper映射集合时,如何在单次映射中动态设置属性值?
问题描述
现有两个类:
class A { public int MyProperty { get; set; } } class ADto { public int MyProperty { get; set; } public bool Flag { get; set; } }
我希望通过_mapper.Map<IEnumerable<ADto>>(aList)将IEnumerable<A>映射为IEnumerable<ADto>,但需要为每个被映射的ADto计算Flag属性的值。我不想全局配置映射,而是在本次特定映射时定义回调,请问能否在映射过程中设置该Flag的值?
解决方案
当然可以,无需全局配置映射,以下几种灵活方式可在单次映射时指定Flag的计算逻辑:
方式一:通过映射操作选项配置后置逻辑
使用Map方法的重载,传入映射操作选项,通过AfterMap在每个对象映射完成后设置Flag:
var dtoList = _mapper.Map<IEnumerable<ADto>>(aList, opt => { opt.AfterMap((src, dest) => { // 此处编写Flag的计算逻辑,示例为根据MyProperty判断 dest.Flag = src.MyProperty > 10; }); });
方式二:结合LINQ投影补充属性
先通过AutoMapper完成基础属性映射,再用LINQ遍历补充Flag值,逻辑更直观:
var dtoList = _mapper.Map<IEnumerable<ADto>>(aList) .Select(dto => { dto.Flag = dto.MyProperty % 2 == 0; // 自定义计算逻辑 return dto; });
方式三:临时指定属性映射规则
直接在映射选项中为Flag字段指定映射来源,仅对本次映射生效:
var dtoList = _mapper.Map<IEnumerable<ADto>>(aList, opt => { opt.ForMember(dest => dest.Flag, cfg => cfg.MapFrom(src => src.MyProperty >= 5)); });
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

