You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:12:38