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

如何在低版本AutoMapper中替换IncludeMembers()方法?

替换AutoMapper旧版本中缺失的IncludeMembers()方法

问题背景

我之前用新版AutoMapper编写了映射代码,后来因降级TargetFramework同步降低了AutoMapper版本,发现目标版本没有IncludeMembers()方法,需要替换原有代码(刚接触AutoMapper)。

源类定义

class Person
{
    public Info info { get; set; }
}

class Info
{
    public AdditionalInfo additionalInfo { get; set; }
}

class AdditionalInfo
{
    // 其他属性
}

目标类定义

class PersonModel
{
    public InfoModel info { get; set; }
    // 假设还有来自Info/AdditionalInfo的平级属性,比如Name、Address
    public string Name { get; set; }
    public string Address { get; set; }
}

class InfoModel
{
    public AdditionalInfoModel additionalInfo { get; set; }
}

class AdditionalInfoModel
{
    // 其他属性
}

原映射代码(依赖IncludeMembers())

CreateMap<Person, PersonModel>().IncludeMembers(src => src.info)
    .ForMember(dest => dest.info, opt => opt.MapFrom(src => src.info));

CreateMap<Info, PersonModel>().IncludeMembers(src => src.additionalInfo);

CreateMap<AdditionalInfo, PersonModel>();

替换方案(适配旧版AutoMapper)

IncludeMembers()的核心作用是把嵌套对象的属性平展映射到目标对象的顶层,旧版中我们需要通过ForMember()手动指定每个平展属性的来源路径:

// 先创建嵌套对象的基础映射
CreateMap<AdditionalInfo, AdditionalInfoModel>();
CreateMap<Info, InfoModel>();

// 主映射:手动指定所有需要平展的属性来源
CreateMap<Person, PersonModel>()
    // 映射嵌套的info对象
    .ForMember(dest => dest.info, opt => opt.MapFrom(src => src.info))
    // 映射来自Info的平级属性
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.info.Name))
    // 映射来自AdditionalInfo的平级属性
    .ForMember(dest => dest.Address, opt => opt.MapFrom(src => src.info.additionalInfo.Address));

特殊情况说明

如果你的PersonModel只有嵌套的info属性,没有平展属性,那原来的IncludeMembers()其实是多余的——AutoMapper默认会递归映射嵌套对象,只需保留基础映射即可:

CreateMap<AdditionalInfo, AdditionalInfoModel>();
CreateMap<Info, InfoModel>();
CreateMap<Person, PersonModel>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:54:06