如何在低版本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
相关产品推荐
相关产品推荐

