AutoMapper父类属性映射子类对象不符合预期的配置问题
解决方案
问题出在AutoMapper默认会根据属性的声明类型(BaseBO)选择映射规则,而非运行时的实际子类类型。要实现SubBO1到SubVO1的映射且不修改父类相关配置,可以在A_BO到A_VO的映射中,显式指定Sub属性按运行时类型转换:
修改后的Profile配置
public class TestConfigProfile : Profile { public TestConfigProfile() { CreateMap<BaseBO, BaseVO>(); CreateMap<SubBO1, SubVO1>(); CreateMap<A_BO, A_VO>() .ForMember(dest => dest.Sub, opt => opt.ResolveUsing((src, _, __, context) => context.Mapper.Map(src.Sub, src.Sub.GetType(), typeof(BaseVO)))); } public class A_BO { public BaseBO Sub { get; set; } } public class A_VO { public BaseVO Sub { get; set; } } public class BaseBO { public int Id { get; set; } public string Name { get; set; } } public class BaseVO { public int Id { get; set; } public string Name { get; set; } } public class SubBO1 : BaseBO { public int Size { get; set; } } public class SubVO1 : BaseVO { public int Size { get; set; } } }
原理说明
- 通过
ResolveUsing自定义Sub属性的映射逻辑,利用AutoMapper上下文的Mapper实例,根据src.Sub的运行时类型(SubBO1)选择对应的映射规则(SubBO1→SubVO1)。 - 这种方式无需修改父类
BaseBO的映射配置,完全符合你“不想使用父类相关映射方式”的要求。
验证测试
运行原测试代码后,vo.Sub的实际类型会是SubVO1,且Size属性值4421会被正确映射。
内容的提问来源于stack exchange,提问作者大師兄丶
相关产品推荐
相关产品推荐

