使用AutoMapper将对象列表映射至含布尔属性的类
使用AutoMapper将折扣列表映射为布尔属性类
1. 定义源类与目标类结构
先明确你的源类和目标类代码结构:
源类
public class HomeInfoBuilding { public HomeInfoBuildingEntry[] appliedDiscountsField { get; set; } } public class HomeInfoBuildingEntry { public string DiscountType { get; set; } public bool DiscountValue { get; set; } // 其他业务属性 }
目标类
public class AppliedDiscountInfo { public bool? AgeDiscount { get; set; } public bool? SeniorDiscount { get; set; } public bool? StudentDiscount { get; set; } // 其他对应折扣的可空布尔属性 }
2. 基础映射配置
直接在AutoMapper配置中,为每个目标属性指定判断逻辑:
var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<HomeInfoBuilding, AppliedDiscountInfo>() // 映射AgeDiscount:检查数组中是否存在对应类型且值为true的条目 .ForMember(dest => dest.AgeDiscount, opt => opt.MapFrom(src => src.appliedDiscountsField?.Any(x => x.DiscountType == "AgeDiscount" && x.DiscountValue))) // 映射SeniorDiscount .ForMember(dest => dest.SeniorDiscount, opt => opt.MapFrom(src => src.appliedDiscountsField?.Any(x => x.DiscountType == "SeniorDiscount" && x.DiscountValue))) // 映射StudentDiscount .ForMember(dest => dest.StudentDiscount, opt => opt.MapFrom(src => src.appliedDiscountsField?.Any(x => x.DiscountType == "StudentDiscount" && x.DiscountValue))); // 其他折扣属性按相同逻辑添加 }); // 初始化映射器并执行映射 var mapper = mapperConfig.CreateMapper(); HomeInfoBuilding sourceData = GetYourSourceData(); // 替换为你的源对象获取逻辑 AppliedDiscountInfo result = mapper.Map<AppliedDiscountInfo>(sourceData);
3. 优化方案:自定义值解析器
如果需要映射的折扣属性较多,可通过自定义值解析器减少重复代码:
自定义解析器
public class DiscountTypeResolver : IValueResolver<HomeInfoBuilding, AppliedDiscountInfo, bool?> { private readonly string _targetDiscountType; public DiscountTypeResolver(string discountType) { _targetDiscountType = discountType; } public bool? Resolve(HomeInfoBuilding source, AppliedDiscountInfo destination, bool? destMember, ResolutionContext context) { return source.appliedDiscountsField?.Any(x => x.DiscountType == _targetDiscountType && x.DiscountValue); } }
使用解析器的映射配置
var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<HomeInfoBuilding, AppliedDiscountInfo>() .ForMember(dest => dest.AgeDiscount, opt => opt.MapFrom(new DiscountTypeResolver("AgeDiscount"))) .ForMember(dest => dest.SeniorDiscount, opt => opt.MapFrom(new DiscountTypeResolver("SeniorDiscount"))) .ForMember(dest => dest.StudentDiscount, opt => opt.MapFrom(new DiscountTypeResolver("StudentDiscount"))); });
逻辑说明
- 当
appliedDiscountsField为null时,目标属性会被设为null(符合可空布尔类型的定义) - 当数组存在但无匹配的折扣条目时,目标属性为
false - 当数组中存在对应
DiscountType且DiscountValue为true的条目时,目标属性为true
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

