Automapper新手求助:类名与属性名不同时如何映射对象?
当然可以!AutoMapper完美支持类名/属性名不同的对象映射(含集合)
作为AutoMapper新手,你完全不用担心类名、属性名不一致的问题——这正是AutoMapper的核心能力之一,哪怕对象里包含集合也能轻松处理。我结合你给出的类定义,给你一步步演示具体实现:
第一步:补全目标DTO类定义
首先我们需要对应你的Employee和Job,定义类名/属性名不同的DTO(这里假设你要映射到StaffDto和EmploymentRecordDto,属性名也做对应调整):
// 目标DTO:类名和Employee不同,属性名也对应调整 public class StaffDto { public string FullName { get; set; } // 对应Employee的Name public string HomeAddress { get; set; } // 对应Employee的Address public List<EmploymentRecordDto> EmploymentHistory { get; set; } // 对应Employee的Jobs } // 集合元素的目标DTO public class EmploymentRecordDto { public string EmployerName { get; set; } // 对应Job的CompanyName }
第二步:配置AutoMapper映射规则
接下来创建映射配置,明确指定源类型和目标类型的对应关系,包括不同名的属性和集合:
// 创建映射配置 var config = new MapperConfiguration(cfg => { // 配置Employee到StaffDto的映射(类名不同直接指定两个类型即可) cfg.CreateMap<Employee, StaffDto>() // 映射源Name到目标FullName .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name)) // 映射源Address到目标HomeAddress .ForMember(dest => dest.HomeAddress, opt => opt.MapFrom(src => src.Address)) // 映射源Jobs集合到目标EmploymentHistory集合 .ForMember(dest => dest.EmploymentHistory, opt => opt.MapFrom(src => src.Jobs)); // 配置Job到EmploymentRecordDto的映射(集合元素的映射必须单独配置) cfg.CreateMap<Job, EmploymentRecordDto>() .ForMember(dest => dest.EmployerName, opt => opt.MapFrom(src => src.CompanyName)); }); // 开发阶段建议添加配置验证,提前排查映射错误 config.AssertConfigurationIsValid();
第三步:执行映射
配置完成后,就可以创建Mapper实例并执行映射了:
// 创建Mapper实例 var mapper = config.CreateMapper(); // 准备源数据 var employee = new Employee { Name = "Jane Smith", Address = "456 Oak Ave", Jobs = new List<Job> { new Job { CompanyName = "Alpha Solutions" }, new Job { CompanyName = "Beta Industries" } } }; // 执行映射 var staffDto = mapper.Map<StaffDto>(employee);
关键知识点总结
- 类名不影响映射:AutoMapper只关心你在
CreateMap<TSource, TDestination>中指定的类型,完全不依赖类名匹配。 - 属性名不同用ForMember:只要通过
.ForMember()明确指定源属性和目标属性的对应关系,哪怕名字完全不一样也能正确映射。 - 集合自动递归映射:只要你配置了集合元素的映射规则(比如
Job到EmploymentRecordDto),AutoMapper会自动遍历集合中的每个元素完成映射,不需要额外处理集合本身的逻辑。 - 配置验证很重要:
AssertConfigurationIsValid()会检查所有目标属性是否都有对应的映射规则,能帮你在开发阶段提前发现遗漏的配置。
内容的提问来源于stack exchange,提问作者Ramppy Dumppy
相关产品推荐
相关产品推荐

