我的计划如下:
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的程序中。Enum.IsDefined或Enum.TryParse只是为了确保我不会得到任何其他的垃圾字符,而这些字符都不会给任何人下决心。
发布于 2016-07-14 17:07:12
Enum.TryParse用于解析枚举元素的名称或底层数值的字符串表示形式(例如,"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.");
}发布于 2016-07-14 16:57:11
是的,那是因为你的枚举实际上是:
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);发布于 2016-07-14 17:00:48
除了乔恩的回答之外,根据文档Char也不是c#枚举的有效基类型。。
节选:
枚举的批准类型为:字节、字节、短、ushort、int、uint、long或ulong。
我假设Char是自动的隐式转换为另一种类型。
https://stackoverflow.com/questions/38379990
复制相似问题