优先使用 Enum.TryParse 而非 Enum.Parse,因其不抛异常、返回 bool 并支持忽略大小写;对空值、别名、本地化等边界需额外封装处理。

Enum.Parse 会直接抛异常,别在生产环境裸用
它不处理空值、空字符串、大小写不匹配或拼写错误——只要输入不符合枚举定义,就扔 ArgumentException 或 FormatException。你得先兜底,不能指望用户输对。
- 用前必须
string.IsNullOrWhiteSpace()判空 - 大小写敏感:默认只认首字母大写的写法(如
"Red"),传"red"就崩 - 想忽略大小写?必须显式传
true给第三个参数:Enum.Parse<Color>(input, true) - 如果只是想“试试看”,优先用
Enum.TryParse,它返回bool,不抛异常
Enum.TryParse 才是日常转换的主力
它把解析逻辑和错误处理打包好了,适合表单提交、配置读取、API 参数绑定这类不可控输入场景。
- 签名是
Enum.TryParse<TEnum>(string, out TEnum),返回bool表示是否成功 - 失败时
out变量是枚举的默认值(通常是0,对应第一个成员或显式标记[DefaultValue]的项) - 同样支持忽略大小写:
Enum.TryParse<Color>(input, true, out var result) - 注意:它不接受带空格或连字符的字符串(如
"light blue"),除非你手动映射或用描述特性[Description]配合反射
遇到带空格/中文/别名的枚举值,别硬塞 Parse
比如枚举定义了 LightBlue = 1,但用户传的是 "light blue" 或 "浅蓝色",Enum.Parse 和 TryParse 都无能为力。
- 方案一:用
[Description("浅蓝色")]特性标注枚举成员,再写个扩展方法查DescriptionAttribute - 方案二:建字典
Dictionary<string, Color>手动映射,启动时初始化一次 - 方案三:用
Enum.GetNames+StringComparer.OrdinalIgnoreCase模糊匹配(仅限简单场景,性能差、易误判) - 别在每次调用时反复反射查
Description,缓存结果
性能差异小,但 TryParse 更安全也更符合 C# 习惯
两者底层都走反射,单次调用耗时差别可忽略(纳秒级)。真正影响性能的是你有没有做缓存、有没有重复解析同一字符串。
-
Parse在失败时要构造异常对象,开销比TryParse的false返回高一个数量级 - .NET 5+ 中
Enum.TryParse已内联优化,且支持 span 字符串重载:TryParse(ReadOnlySpan<char>, out T) - 如果你确定输入绝对可信(比如硬编码字符串或单元测试),可以用
Parse;其余情况,一律用TryParse
枚举解析看着简单,真正麻烦的是边界:空、错位、别名、本地化。别指望一个函数解决所有问题,得根据输入来源决定用哪层封装。










