如何用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
相关产品推荐
相关产品推荐

