如何全局修改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
相关产品推荐
相关产品推荐

