AutoMapper 6.2.2:映射类A部分属性并保留基类BaseA属性的方法
嘿,这个问题我之前也碰到过!AutoMapper的ForAllOtherMembers确实会把基类的成员也一并忽略掉,不过我们可以通过先明确包含基类映射的方式来解决这个问题,完美满足你的三个需求。
下面是具体的实现步骤和代码示例:
方法一:用IncludeBase继承基类映射(推荐)
这种方式最简洁,尤其当基类属性比较多的时候:
- 首先配置基类
BaseA的映射(如果源基类和目标基类属性名一致,AutoMapper会自动映射,不需要额外配置成员):
// 假设你的源基类是SourceBaseA,目标基类是BaseA CreateMap<SourceBaseA, BaseA>();
- 然后配置子类
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
相关产品推荐
相关产品推荐

