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

如何用AutoMapper将两个属性映射为单个数组属性?

AutoMapper实现多属性合并为数组的解决方案

AutoMapper完全支持将多个源属性合并映射为目标数组属性的场景,你之前遇到的覆盖问题是因为重复调用ForMember设置同一个目标属性导致的——每次ForMember都会覆盖之前对该属性的配置,正确的做法是在同一个ForMember配置中一次性处理两个源属性。

具体实现示例

1. 模型定义

public class House
{
    public string PeriodStart { get; set; }
    public string PeriodEnd { get; set; }
}

public class HouseDto
{
    public DateTime[] ProductionDates { get; set; }
}

2. 映射配置

在CreateMap中,通过MapFrom将PeriodStart和PeriodEnd解析为日期后组合成数组:

var mapperConfig = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<House, HouseDto>()
        .ForMember(dest => dest.ProductionDates, opt => opt.MapFrom(src =>
            new[]
            {
                DateTime.Parse(src.PeriodStart),
                DateTime.Parse(src.PeriodEnd)
            }));
});

// 验证配置(可选,用于检查映射是否存在错误)
mapperConfig.AssertConfigurationIsValid();

var mapper = mapperConfig.CreateMapper();

3. 容错处理(可选)

如果需要处理日期字符串解析失败的情况,可以加入DateTime.TryParse逻辑避免异常:

.ForMember(dest => dest.ProductionDates, opt => opt.MapFrom(src =>
{
    var dateList = new List<DateTime>();
    
    if (DateTime.TryParse(src.PeriodStart, out DateTime startDate))
        dateList.Add(startDate);
    
    if (DateTime.TryParse(src.PeriodEnd, out DateTime endDate))
        dateList.Add(endDate);
    
    return dateList.ToArray();
}));

4. 使用映射

var house = new House
{
    PeriodStart = "2023-01-01",
    PeriodEnd = "2023-12-31"
};

var houseDto = mapper.Map<HouseDto>(house);
// houseDto.ProductionDates 将包含两个DateTime元素:2023-01-01 和 2023-12-31

关键说明

  • 不要重复对同一个目标属性调用ForMember,否则后续配置会覆盖之前的设置。
  • MapFrom方法支持自定义逻辑,你可以在这里完成任意多源属性到目标属性的转换。

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:48:15