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

如何用AutoMapper实现继承类与组合类之间的映射?

问题场景

业务层采用多层继承结构(结构无法修改),数据库层通过组合方式模拟对应层级,使用AutoMapper进行对象映射时,继承类与组合类的跨结构属性无法自动关联。示例代码如下:

业务层对象

// Business layer objects
public class A : B
{
    public int SomeValue { get; set; }
}

public abstract class B
{
    public int OtherValue { get; set; }
}

数据库层对象

// Database layer objects
public class ADbo
{
    public int SomeValue { get; set; }
    
    public BDbo Data { get; set; }
}

public class BDbo
{
    public int OtherValue { get; set; }
}

现有配置无法完成继承与组合的跨结构映射(注:原配置存在拼写错误CreatMap,正确应为CreateMap):

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<A, ADbo>().ReverseMap();
    cfg.CreateMap<B, BDbo>().ReverseMap();
});
可行解决方案

AutoMapper支持这种跨结构映射,但需要显式配置成员映射规则,关联继承类的基类属性与组合类的嵌套对象属性:

完整映射配置

var config = new MapperConfiguration(cfg => {
    // 配置基类与嵌套对象的基础映射
    cfg.CreateMap<B, BDbo>().ReverseMap();

    // 配置 A → ADbo:将A的基类属性映射到ADbo的Data属性
    cfg.CreateMap<A, ADbo>()
        .ForMember(dest => dest.Data, opt => opt.MapFrom(src => src))
        // 反向映射 ADbo → A:从Data中提取基类属性值
        .ReverseMap()
        .ForMember(dest => dest.OtherValue, opt => opt.MapFrom(src => src.Data.OtherValue));
});

配置说明

  • 正向映射(A→ADbo):通过MapFrom(src => src)将包含基类属性的A对象,复用已配置的B→BDbo规则映射到ADbo的Data属性。
  • 反向映射(ADbo→A):显式指定A的OtherValue属性从ADbo的Data.OtherValue取值,SomeValue会自动匹配同名属性。

验证示例

var mapper = config.CreateMapper();

// 正向映射测试
var a = new A { SomeValue = 1, OtherValue = 2 };
var aDbo = mapper.Map<ADbo>(a);
// 结果:aDbo.SomeValue = 1,aDbo.Data.OtherValue = 2

// 反向映射测试
var aDbo2 = new ADbo { SomeValue = 3, Data = new BDbo { OtherValue = 4 } };
var a2 = mapper.Map<A>(aDbo2);
// 结果:a2.SomeValue = 3,a2.OtherValue = 4

若存在更复杂的多层级结构,可按相同逻辑扩展:为每一层继承类与对应组合类配置成员映射,复用基础的基类↔嵌套对象映射规则即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:08:24