在C#中把一个字符串转换为一个枚举

c# string enums


在C#中把字符串转换为枚举值的最佳方法是什么?

我有一个包含枚举值的HTML选择标签。当页面被发布时,我想获取该值(将以字符串的形式)并将其转换为枚举值。

在一个理想的世界里,我可以做这样的事情。

StatusEnum MyStatus = StatusEnum.Parse("Active");

但这不是一个有效的代码。




Answer 1 Keith


在.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) 都会是有效的,但毫无意义)。通常最好避免使用仅适用于非常特定的上下文的额外方法来使Microsoft的核心类混乱,除非整个开发团队对这些扩展的工作有很好的了解。




Answer 2 Erwin Mayer


使用 Enum.TryParse<T>(String, T) (≥.NET 4.0):

StatusEnum myStatus;
Enum.TryParse("Active", out myStatus);

可以使用C#7.0的参数类型内联将其进一步简化:

Enum.TryParse("Active", out StatusEnum myStatus);



Answer 3 McKenzieG1


请注意, Enum.Parse() 的性能很差,因为它是通过反射实现的。( Enum.ToString 也是如此,反之亦然。)

如果您需要使用对性能敏感的代码将字符串转换为Enums,最好的选择是在启动时创建 Dictionary<String,YourEnum> 并使用该代码进行转换。




Answer 4 DavidWhitney


您正在寻找Enum.Parse

SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");



Answer 5 Foyzul Karim


您现在可以使用扩展方法

public static T ToEnum<T>(this string value, bool ignoreCase = true)
{
    return (T) Enum.Parse(typeof (T), value, ignoreCase);
}

您可以通过以下代码对其进行调用(此处, FilterType 是枚举类型):

FilterType filterType = type.ToEnum<FilterType>();