【问题标题】:Parse enum from String not working从字符串解析枚举不起作用
【发布时间】:2013-09-27 14:17:52
【问题描述】:

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

产量:

无法将类型“object”隐式转换为“States”。显式转换 存在。

【问题讨论】:

    标签: c# enums


    【解决方案1】:

    是的,您需要发送您正在解析的枚举类型(使用typeof):

    States state = (States)Enum.Parse(typeof(States), myString, true);
    

    Parse 方法需要 System.Type 类型的参数。不是 类型 States

    这是docs的签名。

    [ComVisibleAttribute(true)]
    public static Object Parse(
        Type enumType,
        string value,
        bool ignoreCase
    )
    

    Parse 返回一个object,因此它要求您在解析后强制转换为您的类型。

    【讨论】:

    • 感谢您的回复。这也是我所坚持的……不幸的是,它不起作用:请参阅更新后的问题。
    • 您还必须转换结果。更新中。
    • 当然!我真是个白痴……非常感谢您的帮助!
    【解决方案2】:

    可以像这样使用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>();
    

    【讨论】:

      【解决方案3】:

      既然是期待一个类型,就把Enum.Parse(States, myString, true)改成;给Enum.Parse(typeof(States), myString, true);

      【讨论】:

        【解决方案4】:

        这是正确的。

        States state = Enum.Parse(typeof(States), myString, true);
        switch (state)
        {
            case States.SomeState:
            case States.SomeOtherState:
                break;
            default:
                break;
        }
        

        【讨论】:

          【解决方案5】:
          States tmp;
           Enum.TryParse<States>(myString,true ,out tmp);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-10
            • 2019-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多