如何在C#中将字符串转换为枚举?
时间:2020-03-05 18:40:42 来源:igfitidea点击:
在C#中将字符串转换为枚举值的最佳方法是什么?
我有一个HTML选择标签,其中包含枚举的值。发布页面后,我要提取值(它将以字符串形式)并将其转换为枚举值。
在理想的世界中,我可以做这样的事情:
StatusEnum MyStatus = StatusEnum.Parse("Active");
但这不是有效的代码。
解决方案
回答
我们正在寻找Enum.Parse。
SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");
回答
在.NET Core和.NET> 4中,有一个通用的解析方法:
Enum.TryParse("Active", out StatusEnum myStatus);
这也包括C#7的新的内联out'变量,因此可以进行try-parse,转换为显式的枚举类型并初始化+填充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);
但是,我会小心地在string
中添加这样的扩展方法,因为(没有名称空间控制)它会出现在string
的所有实例上,无论它们是否具有枚举(所以`1234.ToString()。ToEnum( StatusEnum.None)将是有效的,但毫无意义。通常最好避免使用仅适用于非常特定的上下文的额外方法来使Microsoft的核心类混乱,除非整个开发团队对这些扩展的工作有很好的了解。
回答
Enum.Parse是朋友:
StatusEnum MyStatus = (StatusEnum)Enum.Parse(typeof(StatusEnum), "Active");
回答
object Enum.Parse(System.Type enumType, string value, bool ignoreCase);
因此,如果我们有一个名为mood的枚举,它将看起来像这样:
enum Mood { Angry, Happy, Sad } // ... Mood m = (Mood) Enum.Parse(typeof(Mood), "Happy", true); Console.WriteLine("My mood is: {0}", m.ToString());
回答
// str.ToEnum<EnumType>() T static ToEnum<T>(this string str) { return (T) Enum.Parse(typeof(T), str); }
回答
请注意,Enum.Parse()的性能很差,因为它是通过反射实现的。 (Enum.ToString也是如此,反之亦然。)
如果我们需要使用对性能敏感的代码将字符串转换为Enums,最好的选择是在启动时创建Dictionary <String,YourEnum>
并使用它进行转换。