将一个字符串转换为C#中的枚举类型

26 浏览
0 Comments

将一个字符串转换为C#中的枚举类型

如何在C#中将字符串转换为枚举值是最好的方法?

我有一个包含枚举值的HTML select标签。当页面被提交时,我想要获取该值(以字符串形式呈现)并将其转换为相应的枚举值。

在理想的情况下,我可以像这样做:

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

但那不是有效的代码。

admin 更改状态以发布 2023年5月24日
0
0 Comments

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

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

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

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

0
0 Comments

在 .NET Core 和 .NET Framework ≥4.0 中,存在一个通用的解析方法:

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(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

然后我可以执行以下操作:

StatusEnum MyStatus = EnumUtil.ParseEnum("Active");

评论中建议的一种选项是添加一个扩展,这很简单:

public static T ToEnum(this string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum();

最后,如果字符串无法解析,您可能希望拥有一个默认的枚举:

public static T ToEnum(this string value, T defaultValue) 
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }
    T result;
    return Enum.TryParse(value, true, out result) ? result : defaultValue;
}

这就是调用:

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

但是,如果您将这样的扩展方法添加到 string 中,您需要小心,因为它会出现在所有 string 实例上,无论它们是否持有枚举(因此,1234.ToString().ToEnum(StatusEnum.None) 是有效但不合逻辑的)。除非您的整个开发团队非常了解这些扩展程序的作用,否则最好避免在非常特定的上下文中将额外的方法添加到 Microsoft 的核心类中,以避免杂乱无章。

0