AutoMapper能否合并集合?层级差异映射及双向拆分需求
用AutoMapper处理异构层级的集合映射与反向拆分
核心结论
完全可以用AutoMapper处理这种场景,只需要自定义类型转换规则或映射配置来适配结构差异,无需放弃AutoMapper的现有优势。
正向映射(myData → myDstData)
先明确基础类型定义:
// 源数据类型 public class SourceData { public List<PType> As { get; set; } public List<PType> Bs { get; set; } } // 目标数据类型 public class TargetData { public List<TargetItem> Items { get; set; } } public class TargetItem { public string Type { get; set; } public XType X { get; set; } } // 已存在映射关系的基础类型 public class PType { /* 原有属性 */ } public class XType { /* 原有属性 */ }
配置正向映射
两种实现方式任选:
- 直接投影配置(简洁直观)
var config = new MapperConfiguration(cfg => { // 复用已有的PType→XType映射规则 cfg.CreateMap<PType, XType>(); // 配置SourceData到TargetData的映射逻辑 cfg.CreateMap<SourceData, TargetData>() .ForMember(dest => dest.Items, opt => opt.MapFrom(src => src.As.Select(p => new TargetItem { Type = "A", X = cfg.CreateMapper().Map<XType>(p) }) .Concat(src.Bs.Select(p => new TargetItem { Type = "B", X = cfg.CreateMapper().Map<XType>(p) })) .ToList() )); }); // 验证配置合法性(推荐执行) config.AssertConfigurationIsValid(); // 执行映射 var mapper = config.CreateMapper(); TargetData myDstData = mapper.Map<SourceData, TargetData>(myData);
- 自定义类型转换器(适合复杂逻辑扩展)
public class SourceToTargetConverter : ITypeConverter<SourceData, TargetData> { private readonly IMapper _mapper; public SourceToTargetConverter(IMapper mapper) { _mapper = mapper; } public TargetData Convert(SourceData source, TargetData destination, ResolutionContext context) { var items = new List<TargetItem>(); items.AddRange(source.As.Select(p => new TargetItem { Type = "A", X = _mapper.Map<XType>(p) })); items.AddRange(source.Bs.Select(p => new TargetItem { Type = "B", X = _mapper.Map<XType>(p) })); return new TargetData { Items = items }; } } // 配置时替换为: cfg.CreateMap<SourceData, TargetData>().ConvertUsing<SourceToTargetConverter>();
反向映射(myDstData → myData)
配置反向拆分逻辑即可:
cfg.CreateMap<TargetData, SourceData>() .ForMember(dest => dest.As, opt => opt.MapFrom(src => src.Items.Where(item => item.Type == "A").Select(item => _mapper.Map<PType>(item.X)).ToList() )) .ForMember(dest => dest.Bs, opt => opt.MapFrom(src => src.Items.Where(item => item.Type == "B").Select(item => _mapper.Map<PType>(item.X)).ToList() )); // 补充XType→PType的反向映射规则(若之前未配置) cfg.CreateMap<XType, PType>();
多层嵌套对象的适配
如果你的对象有5-6层嵌套,只需确保每个层级的映射配置到位:对于结构一致的层级,AutoMapper会自动使用默认映射;仅对存在结构差异的层级单独配置自定义规则即可,不会影响整体映射流程。
内容的提问来源于stack exchange,提问作者Tormod
相关产品推荐
相关产品推荐

