在C#中将字符串转换为枚举值的最佳方法是什么?
我有一个HTML选择标签,其中包含枚举的值。发布页面后,我要提取值(它将以字符串形式)并将其转换为枚举值。
在理想的世界中,我可以执行以下操作:
StatusEnum MyStatus = StatusEnum.Parse("Active");
但这不是有效的代码。
在.NET Core和.NET> 4中,有一个通用的解析方法:
Enum.TryParse("Active", out StatusEnum myStatus);
这还包括C#7的新内联out变量,因此可以进行try-parse,转换为显式枚举类型并初始化并填充该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)