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

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 { /* 原有属性 */ }

配置正向映射

两种实现方式任选:

  1. 直接投影配置(简洁直观)
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);
  1. 自定义类型转换器(适合复杂逻辑扩展)
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:00:16