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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:43:05