我应该如何将字符串转换为C#中的枚举?
将字符串转换为C#中的枚举值的最佳方式是什么?
我有一个包含枚举值的HTML选择标记。 当页面发布时,我想获取值(它将以字符串的形式)并将其转换为枚举值。
在理想的世界中,我可以做这样的事情:
StatusEnum MyStatus = StatusEnum.Parse("Active");
但这不是有效的代码。
在.NET Core和.NET> 4中有一个通用的分析方法:
Enum.TryParse("Active", out StatusEnum myStatus);
这也包括C#7的新型直列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);
然而,我会小心增加一个像这样的扩展方法来作为(没有命名空间控制) string
它会出现在string
所有实例是否持有一个枚举或不(因此1234.ToString().ToEnum(StatusEnum.None)
会有效但无意义)。 除非整个开发团队都非常了解这些扩展的功能,否则通常最好避免使用只适用于特定环境的额外方法混淆微软的核心类。
使用Enum.TryParse<T>(String, T)
( Enum.TryParse<T>(String, T)
4.0):
StatusEnum myStatus;
Enum.TryParse("Active", out myStatus);
使用C#7.0的参数类型内联可以进一步简化它:
Enum.TryParse("Active", out StatusEnum myStatus);
请注意,Enum.Parse()的性能很糟糕,因为它是通过反射来实现的。 (Enum.ToString也是如此,反之亦然。)
如果您需要在性能敏感的代码中将字符串转换为枚举类型,最好的方法是在启动时创建一个Dictionary<String,YourEnum>
,并使用它来完成转换。
上一篇: How should I convert a string to an enum in C#?
下一篇: How to get an IEnumerable<string> of enum values attributes?