AutoMapper:能否用ForAllMembers替代多个ForMember配置?
关于AutoMapper下划线与驼峰属性映射的优化方案
当然可以用ForAllMembers替代重复的ForMember配置,但其实AutoMapper本身提供了更简洁的内置命名约定支持,给你两种可行方案:
方案一:使用ForAllMembers统一处理
通过自定义属性名称转换逻辑,把目标的驼峰命名转成下划线格式,再从源对象中匹配对应属性:
using System.Text.RegularExpressions; // 映射配置 CreateMap<LibraryParameters, LibraryDocument>() .ForAllMembers(opt => { // 将驼峰命名转为下划线小写格式 var srcPropertyName = Regex.Replace(opt.DestinationMember.Name, @"(\p{Ll})(\p{Lu})", "$1_$2").ToLower(); // 反射获取源属性值 opt.MapFrom(src => src.GetType().GetProperty(srcPropertyName).GetValue(src)); });
注意:这个方案需要引入System.Text.RegularExpressions命名空间,且要确保所有目标属性都能在源对象中找到对应下划线命名的属性,否则会抛出反射异常。
方案二:使用AutoMapper内置命名约定(推荐)
AutoMapper内置了针对不同命名风格的约定类,直接配置即可自动完成下划线与驼峰的属性匹配,无需手动写每个属性的映射:
全局配置(所有映射生效)
var configuration = new MapperConfiguration(cfg => { // 源对象使用下划线小写命名约定 cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); // 目标对象使用帕斯卡命名(驼峰首字母大写)约定 cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention(); cfg.CreateMap<LibraryParameters, LibraryDocument>(); });
单独映射配置(仅当前映射生效)
CreateMap<LibraryParameters, LibraryDocument>() .SourceMemberNamingConvention<LowerUnderscoreNamingConvention>() .DestinationMemberNamingConvention<PascalCaseNamingConvention>();
这种方案是AutoMapper官方推荐的方式,代码更简洁,也避免了手动反射和正则可能带来的潜在问题,维护性更强。
内容的提问来源于stack exchange,提问作者Allison
相关产品推荐
相关产品推荐

