在 C# 中将字符串转换为枚举值的最佳方法是什么?
我有一个包含枚举值的 HTML 选择标记。当页面发布时,我想将值(将以字符串的形式)取出并将其转换为相应的枚举值。
在理想的世界中,我可以这样做:
StatusEnum MyStatus = StatusEnum.Parse("Active");
但这不是有效的代码。
在 .NET Core 和 .NET Framework ≥4.0中有一个通用的解析方法:
Enum.TryParse("Active", out StatusEnum myStatus);
这还包括 C#7 的新内联out变量,因此这会进行尝试解析、转换为显式枚举类型并初始化+填充myStatus变量。
out
myStatus
如果您可以访问 C#7 和最新的 .NET,这是最好的方法。
在 .NET 中它相当丑陋(直到 4 或更高版本):
StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
我倾向于通过以下方式简化这一点:
public static T ParseEnum<T>(string value) { return (T) Enum.Parse(typeof(T), value, true); }
然后我可以这样做:
StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
评论中建议的一个选项是添加一个扩展,这很简单:
public static T ToEnum<T>(this string value) { return (T) Enum.Parse(typeof(T), value, true); } StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
最后,如果无法解析字符串,您可能希望使用默认枚举:
public static T ToEnum<T>(this string value, T defaultValue) { if (string.IsNullOrEmpty(value)) { return defaultValue; } T result; return Enum.TryParse<T>(value, true, out result) ? result : defaultValue; }
这使得这个电话:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
但是,我会小心地将这样的扩展方法添加到stringas (没有命名空间控制) 它将出现在string它们是否持有枚举的所有实例上 (所以1234.ToString().ToEnum(StatusEnum.None)将是有效但无意义的) 。通常最好避免使用仅适用于非常特定上下文的额外方法来混淆 Microsoft 的核心类,除非您的整个开发团队非常了解这些扩展的作用。
string
1234.ToString().ToEnum(StatusEnum.None)