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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:06:31