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

