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

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,提问作者大師兄丶

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:30:51