如何用AutoMapper将多类聚合对象映射到ViewModel,无需逐个配置成员
如何在ViewModel与ObjectReturnByLinqQuery间实现部分手动映射+自动属性匹配
首先先明确你的类结构(我帮你整理成更易读的格式):
public class ClassOne { public string Id { get; set; } //...其他大量属性 } public class ClassTwo { public string Id { get; set; } //...其他与ClassOne不同的属性 public string Email { get; set; } } public class ClassThree { public string Id { get; set; } //...其他与ClassOne、ClassTwo不同的属性 public string Email { get; set; } } public class ViewModel { //...与ClassOne相同的所有属性 public string EmailClasseTwo { get; set; } public string EmailClassThree { get; set; } } public class ObjectReturnByLinqQuery { public ClassOne classOne { get; set; } public ClassTwo classTwo { get; set; } public ClassThree classThree { get; set; } }
你想要的效果是:只手动映射EmailClasseTwo和EmailClassThree这两个属性,ViewModel里其他和ClassOne同名的属性自动从ObjectReturnByLinqQuery.classOne中获取,不用逐个配置。用AutoMapper的话,有两种简洁的实现方式:
方法一:利用IncludeMembers继承基础映射规则
这种方式适合你已经有ClassOne到ViewModel的映射配置(比如有自定义的成员转换、忽略规则等)的场景:
// 第一步:先配置ClassOne到ViewModel的基础自动映射 // AutoMapper会自动匹配所有同名同类型的属性 config.CreateMap<ClassOne, ViewModel>(); // 第二步:配置ObjectReturnByLinqQuery到ViewModel的映射 config.CreateMap<ObjectReturnByLinqQuery, ViewModel>() // 让AutoMapper应用ClassOne到ViewModel的映射规则来填充大部分属性 .IncludeMembers(src => src.classOne) // 手动指定两个特殊Email属性的映射来源 .ForMember(dest => dest.EmailClasseTwo, opt => opt.MapFrom(src => src.classTwo.Email)) .ForMember(dest => dest.EmailClassThree, opt => opt.MapFrom(src => src.classThree.Email));
方法二:用ForAllOtherMembers直接指定默认源
如果不需要继承额外的映射规则,这种方式更直接:
config.CreateMap<ObjectReturnByLinqQuery, ViewModel>() // 先手动配置两个特殊的Email属性 .ForMember(dest => dest.EmailClasseTwo, opt => opt.MapFrom(src => src.classTwo.Email)) .ForMember(dest => dest.EmailClassThree, opt => opt.MapFrom(src => src.classThree.Email)) // 对ViewModel中剩下的所有属性,自动从classOne中取值 .ForAllOtherMembers(opt => opt.MapFrom(src => src.classOne));
这两种方式都能达到你的需求:不用逐个配置ViewModel里和ClassOne相同的属性,只需要处理那两个特殊的Email字段,剩下的交给AutoMapper自动完成匹配。
内容的提问来源于stack exchange,提问作者Hassan N
相关产品推荐
相关产品推荐

