Automapper教程:如何借助源类型属性映射多个成员?
如何在AutoMapper中利用源类型的属性映射多个成员
嘿,我来帮你搞定这个AutoMapper的映射问题!针对你的类结构,我们有两种简洁实用的方式来实现从UserStatus到UserStatusVM的映射,既能复用已有的User→UserVM映射规则,又能正确映射Status字段。
方法1:用IncludeBase复用基类映射逻辑
因为UserStatusVM继承自UserVM,而你已经定义好了User到UserVM的映射,我们可以直接让UserStatus→UserStatusVM的映射继承基类的映射规则,AutoMapper会自动把UserStatus.User里的属性映射到UserStatusVM的对应基类字段,再单独处理Status字段:
// AutoMapper配置 c.CreateMap<User, UserVM>(); c.CreateMap<UserStatus, UserStatusVM>() .IncludeBase<User, UserVM>() // 复用User到UserVM的映射规则 .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.Status)); // 单独映射Status字段
配置完成后,AutoMapper会自动把UserStatus.User.Id映射到UserStatusVM.Id,UserStatus.User.Name映射到UserStatusVM.Name,同时将UserStatus.Status映射到UserStatusVM.Status,完全匹配你的需求。
方法2:手动指定每个成员的映射源
如果你需要对某些字段做自定义处理(比如添加格式转换、条件判断),可以手动为每个基类字段指定映射源:
// AutoMapper配置 c.CreateMap<User, UserVM>(); c.CreateMap<UserStatus, UserStatusVM>() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.User.Id)) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.User.Name)) .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.Status));
这种方式代码量稍多,但灵活性更高,适合需要对单个字段映射逻辑做特殊调整的场景。
测试验证
你可以用这段代码验证映射是否正常工作:
var config = new MapperConfiguration(c => { // 放入上面的配置代码 }); var mapper = config.CreateMapper(); var user = new User { Id = "123", Name = "John Doe" }; var userStatus = new UserStatus { User = user, Status = 1 }; var userStatusVM = mapper.Map<UserStatusVM>(userStatus); // 此时userStatusVM.Id为"123",Name为"John Doe",Status为1,映射成功
内容的提问来源于stack exchange,提问作者Ilya Loskutov
相关产品推荐
相关产品推荐

