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

如何使用AutoMapper将父类属性映射到子集合的子对象?

解决AutoMapper子DTO从父模型获取属性的问题

嘿,这个需求其实用AutoMapper的上下文特性就能轻松搞定——我们可以在子对象的映射配置里,通过父级映射上下文拿到原始的ParentModel实例,从而把它的Test属性赋值给每个ChildDTO的Test字段。

调整后的映射配置

你只需要修改ChildModel到ChildDTO的映射规则,加入对父上下文的引用即可,父模型到父DTO的映射保持不变:

// 父模型到父DTO的映射(无需修改)
CreateMap<ParentModel, ParentDTO>()
    .ForMember(d => d.Children, opt => opt.MapFrom(s => s.Children));

// 子模型到子DTO的映射(新增父上下文引用)
CreateMap<ChildModel, ChildDTO>()
    .ForMember(dest => dest.Test, 
        opt => opt.MapFrom((_, __, ___, context) => 
            ((ParentModel)context.Parent.SourceValue).Test));

代码解释

当AutoMapper处理ParentModel到ParentDTO的映射时,会遍历Children集合逐个映射ChildModel到ChildDTO。这时候在子对象的映射上下文(context)中:

  • context.Parent指向父级的映射操作
  • context.Parent.SourceValue就是原始的ParentModel实例
  • 我们只需要把这个实例强转为ParentModel,就能拿到它的Test属性值,赋值给ChildDTO.Test

测试验证

你可以用下面的代码测试效果,确保每个子DTO的Test字段都正确继承了父模型的值:

var parentModel = new ParentModel
{
    Id = 1,
    Test = "来自父模型的Test值",
    Children = new List<ChildModel>
    {
        new ChildModel { Id = 101, Name = "子对象1" },
        new ChildModel { Id = 102, Name = "子对象2" }
    }
};

var dto = Mapper.Map<ParentDTO>(parentModel);
// 此时dto.Children中的每个ChildDTO.Test都会等于"来自父模型的Test值"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:12:46