在 .NET Core 和 .NET Framework ≥4.0 there is a generic parse method:
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");
cmets 中建议的一个选项是添加一个扩展,这很简单:
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 的核心类混乱,除非您的整个开发团队非常了解这些扩展的作用。