如何在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 &lt;String,YourEnum>并使用它进行转换。