从字符串解析枚举不起作用
本文关键字:枚举 不起作用 字符串 | 更新日期: 2023-09-27 18:32:59
我有一个像这样声明的public enum
:
public enum States
{
SomeState,
SomeOtherState
}
有一个可能代表上述任何"状态"的任意字符串myString
,我想写一个开关来检查它当前是哪一个。
这是我的尝试。
States state = Enum.Parse(States, myString, true);
switch (state)
{
case States.SomeState:
case States.SomeOtherState:
break;
default:
break;
}
在Enum.Parse()
里面,它告诉我参数 State 被用作类型而不是变量。这不是正确的用法吗?Enum.Parse应该接收的第一个参数是Type enumType
:为什么它告诉我它需要一个变量?
许多善意的回复表示使用typeof
。不幸的是,我已经尝试过了,但由于我收到以下错误,我猜这是一个错误的想法。
Enum.Parse(typeof(States), myString, true);
收益 率:
不能将类型"对象"隐式转换为"状态"。显式转换 存在。
是的,您需要发送要解析的枚举类型(使用 typeof
):
States state = (States)Enum.Parse(typeof(States), myString, true);
Parse
方法需要类型为 System.Type
的参数。 不是类型 States
.
这是文档中的签名。
[ComVisibleAttribute(true)]
public static Object Parse(
Type enumType,
string value,
bool ignoreCase
)
Parse
返回一个object
因此它要求您在分析后强制转换为您的类型。
由于它需要一个类型,所以Enum.Parse(States, myString, true)
; 更改为Enum.Parse(typeof(States), myString, true);
这是正确的。
States state = Enum.Parse(typeof(States), myString, true);
switch (state)
{
case States.SomeState:
case States.SomeOtherState:
break;
default:
break;
}
States tmp;
Enum.TryParse<States>(myString,true ,out tmp);
可以使用如下extension class
使其更优雅:
namespace YourClass.Models;
public static E ToEnum<E>(this object value, bool ignoreCase = true) where E : Enum
{
if(value == null)
{
throw new ArgumentNullException("Value cannot be null");
}
return (E)Enum.Parse(typeof(E), value.ToString(), ignoreCase);
}
并像这样使用它:
States state = myString.ToEnum<States>();