Enum.TryParse和Enum.IsDefined为char枚举返回false

use*_*007 2 c# enums

我的程序如下:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在我的控制台中期待"Yes1"和"Yes2",但看起来它为TryParse和IsDefined返回false.任何帮助表示赞赏.

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

更新

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

Jon*_*eet 7

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

public enum MyStatus
{
    None = 78,
    Done = 67
}
Run Code Online (Sandbox Code Playgroud)

因此"N"既不是枚举值的名称,也不是十进制表示."无"和"78"都会解析MyStatus.None,但"N" 不会解析.

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

var dictionary = Enum.GetValues(typeof(MyStatus))
                     .Cast<MyStatus>()
                     .ToDictionary(x => (char) x);
Run Code Online (Sandbox Code Playgroud)


JLR*_*she 5

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

char _status = 'C'
var status = (MyStatus)_status;
Run Code Online (Sandbox Code Playgroud)

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

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