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

AutoMapper 6.2.2:映射类A部分属性并保留基类BaseA属性的方法

嘿,这个问题我之前也碰到过!AutoMapper的ForAllOtherMembers确实会把基类的成员也一并忽略掉,不过我们可以通过先明确包含基类映射的方式来解决这个问题,完美满足你的三个需求。

下面是具体的实现步骤和代码示例:

方法一:用IncludeBase继承基类映射(推荐)

这种方式最简洁,尤其当基类属性比较多的时候:

  1. 首先配置基类BaseA的映射(如果源基类和目标基类属性名一致,AutoMapper会自动映射,不需要额外配置成员):
// 假设你的源基类是SourceBaseA,目标基类是BaseA
CreateMap<SourceBaseA, BaseA>();
  1. 然后配置子类A的映射,通过IncludeBase引入基类的映射规则,再指定子类需要自定义映射的属性,最后忽略子类其他未指定的属性:
CreateMap<SourceA, A>()
    // 先应用基类的所有映射规则
    .IncludeBase<SourceBaseA, BaseA>()
    // 配置A类需要映射的特定属性(这里替换成你实际的属性)
    .ForMember(dest => dest.ACustomProperty, opt => opt.MapFrom(src => src.SourceACustomProperty))
    // 忽略A类中除了基类属性和已指定属性之外的其他成员
    .ForAllOtherMembers(opt => opt.Ignore());

方法二:手动映射基类属性(适合基类属性少的场景)

如果基类属性不多,你也可以直接在子类映射中手动指定所有基类属性,然后再处理子类的属性和忽略规则:

CreateMap<SourceA, A>()
    // 手动映射基类的所有属性
    .ForMember(dest => dest.BaseProperty1, opt => opt.MapFrom(src => src.SourceBaseProperty1))
    .ForMember(dest => dest.BaseProperty2, opt => opt.MapFrom(src => src.SourceBaseProperty2))
    // 配置A类的特定属性
    .ForMember(dest => dest.ACustomProperty, opt => opt.MapFrom(src => src.SourceACustomProperty))
    // 忽略A类其他未指定的属性
    .ForAllOtherMembers(opt => opt.Ignore());

为什么之前的写法会忽略基类属性?

因为ForAllOtherMembers是针对**整个目标类型(包括继承的基类成员)**生效的,当你直接调用它时,基类的所有未被显式配置的成员也会被标记为忽略。而用IncludeBase可以先把基类的映射规则应用上,这样基类的成员就不会被后续的ForAllOtherMembers忽略了。

内容的提问来源于stack exchange,提问作者GuRAm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:25:27