【问题标题】:Enum.TryParse and Enum.IsDefined returns false for char EnumsEnum.TryParse 和 Enum.IsDefined 为 char 枚举返回 false
【发布时间】:2016-07-19 22:48:20
【问题描述】:

我的程序如下:

using System;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            char _status = 'C';            
            Console.WriteLine(_status.ToString());            

            if (Enum.IsDefined(typeof(MyStatus), _status.ToString()))
            {
                Console.WriteLine("Yes1");
            }
            else
            {
                Console.WriteLine("No1");
            }

            MyStatus myStatus; 
            if(Enum.TryParse(_status.ToString(), true, out myStatus))
            {
                Console.WriteLine("Yes2");
            }
            else
            {
                Console.WriteLine("No2");
            }
        }

        public enum MyStatus
        {
            None = 'N',
            Done = 'C'
            //Other Enums
        }
    }
}

我期待控制台中出现“Yes1”和“Yes2”,但看起来它为 TryParse 和 IsDefined 返回 false。任何帮助表示赞赏。

代码可以在http://rextester.com/CSFG46040访问

更新

这个值基本上来自一个数据库并被映射到一个字符字段。我还需要让它暴露给已经使用这个字符字段作为枚举的程序。 Enum.IsDefined 或 Enum.TryParse 只是为了确保我没有得到任何其他会被解析为 None 的垃圾字符。

【问题讨论】:

    标签: c# enums


    【解决方案1】:

    是的,那是因为你的枚举是有效的:

    public enum MyStatus
    {
        None = 78,
        Done = 67
    }
    

    所以“N”既不是枚举值的名称,也不是十进制表示。 “None”和“78”都会解析为MyStatus.None,但“N”不会。

    听起来你很可能想要Dictionary<char, MyStatus>。如果您想将每个枚举值的数值视为一个字符,您可以使用以下方法构建它:

    var dictionary = Enum.GetValues(typeof(MyStatus))
                         .Cast<MyStatus>()
                         .ToDictionary(x => (char) x);
    

    【讨论】:

      【解决方案2】:

      除了Jon's Answers,根据文档Char is also not a valid base type for c# enums

      摘录:

      允许的枚举类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。

      我会假设 Char 是 Implicitly converted to another type 自动。

      【讨论】:

        【解决方案3】:

        Enum.TryParse 用于解析枚举元素的 Names 或底层数值的字符串表示形式(例如,"123" 用于 123)。如果您已经拥有 char 的实际值,则可以使用强制转换:

        char _status = 'C'
        var status = (MyStatus)_status;
        

        如果您担心它可能不是有效值之一,可以将其与 Enum.IsDefined() 结合使用:

        if (Enum.IsDefined(typeof(MyStatus), (int)_status))
        {
            var status = (MyStatus)_status;
            Console.WriteLine(status);
        }
        else 
        {
            Console.WriteLine("Not a valid value.");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-28
          • 2017-12-03
          • 1970-01-01
          • 2012-05-17
          • 2012-11-27
          • 1970-01-01
          • 2012-09-03
          • 2014-09-08
          相关资源
          最近更新 更多