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

如何全局修改Enum.ToString()默认输出为snake_case而非PascalCase?

解决方案

首先明确:Enum.ToString()是.NET内置方法,没法直接替换它的全局默认行为,但可以通过以下几种方式实现全局可用的snake_case转换:

1. 自定义扩展方法(推荐)

写一个全局扩展方法,所有枚举类型都能直接调用,无需重复配置:

public static class EnumExtensions
{
    public static string ToSnakeCase(this Enum enumValue)
    {
        string pascalName = enumValue.ToString();
        // 转换逻辑:在大写字母前加下划线,整体转小写
        return string.Concat(pascalName.Select((c, index) => 
            index > 0 && char.IsUpper(c) ? $"_{c.ToString().ToLower()}" : c.ToString().ToLower()));
    }
}

使用时直接替换原来的ToString():

TypeString = types.ToSnakeCase(); // 输出horizon_focus

这个方法简单直接,所有枚举都能复用,不用给每个枚举加特性或额外配置。

2. 反射+缓存的全局转换工具

如果不想修改现有代码里的ToString()调用,可以写一个工具类,用缓存存枚举值的snake_case映射,避免重复计算:

public static class EnumSnakeCaseHelper
{
    private static readonly Dictionary<Enum, string> _snakeCaseCache = new();

    public static string GetSnakeCase(Enum enumValue)
    {
        if (_snakeCaseCache.TryGetValue(enumValue, out var snakeCase))
            return snakeCase;

        string pascalName = enumValue.ToString();
        snakeCase = string.Concat(pascalName.Select((c, index) => 
            index > 0 && char.IsUpper(c) ? $"_{c.ToString().ToLower()}" : c.ToString().ToLower()));
        
        _snakeCaseCache[enumValue] = snakeCase;
        return snakeCase;
    }
}

使用时:

TypeString = EnumSnakeCaseHelper.GetSnakeCase(types);

关于Macross.Json.Extensions配置无效的原因

你用的JsonStringEnumMemberConverter是专门处理JSON序列化/反序列化的,只会影响枚举在JSON中的输出格式,不会改变Enum.ToString()的原生行为,所以TypeString还是会输出PascalCase。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:20:28