2

我有一个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);

产量:

不能将类型“对象”隐式转换为“状态”。存在显式转换。

4

5 回答 5

6

是的,您需要发送您正在解析的枚举类型(使用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返回 anobject因此它要求您在解析后强制转换为您的类型。

于 2013-09-27T14:19:51.660 回答
1

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>();
于 2021-12-12T12:16:41.640 回答
0
States tmp;
 Enum.TryParse<States>(myString,true ,out tmp);
于 2013-09-27T14:21:50.780 回答
0

因为它需要一个类型,所以改变Enum.Parse(States, myString, true);至Enum.Parse(typeof(States), myString, true);

于 2013-09-27T14:20:42.040 回答
0

这是正确的。

States state = Enum.Parse(typeof(States), myString, true);
switch (state)
{
    case States.SomeState:
    case States.SomeOtherState:
        break;
    default:
        break;
}
于 2013-09-27T14:20:43.930 回答