我已经将Enum定义为blow,它包括int类型和字符类型。
我试图将字符串解析为枚举,但它会输入字符时发生错误。
如何解决此问题?
//parse successfully.
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "1");
//error:Requested value 'A' was not found.
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "A");
public enum MyEnum
{
[Description("Des1")]
Status1 = 1,
[Description("Des2")]
Status2 = 2,
[Description("Des3")]
Status3 = 3,
[Description("Des4")]
Status4 = 4,
[Description("Des7")]
Status5 = 5,
[Description("Des6")]
Status6 = 6,
[Description("Des7")]
Status7 = 7,
[Description("Des8")]
Status8 = 8,
[Description("Des9")]
Status9 = 9,
[Description("DesA")]
StatusA = 'A',
[Description("DesB")]
StatusB = 'B',
[Description("DesC")]
StatusC = 'C',
}
更新:
好的,我想我需要检查输入是数字还是不做不同的过程。代码如下,谢谢大家的建议。
string inputParam = "A";
int useLess;
MyEnum myEnum;
var isDigit = int.TryParse(inputParam, out useLess);
if (isDigit) {
myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), inputParam);
}
else
{
myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), ((int)Convert.ToChar(inputParam)).ToString());
}
这里的问题是枚举实际上是基于int
值的,因此char值被转换为int
。
换句话说,这个:
StatusA = 'A',
实际转换为:
StatusA = 65,
因为StatusA
的实际数值是65
,所以您必须执行以下操作:
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "65");
或者使65
是'A'
:更加明显
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), ((int)'A').ToString());
注意,enum.Parse()
将解析枚举成员的名称,或者解析包含枚举成员的数值的字符串,因此;65〃;或";状态A";会起作用。
因此,以下所有行都将返回相同的结果:
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "65");
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), ((int)'A').ToString());
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "StatusA");
Enum.Parse
仅适用于相关常数值的名称或数值。枚举成员的。CCD_ 9两者都不是。如果您已经将字符串"65"
传递给该方法,它就会起作用。
请注意,如何编写关联的常数值并不重要——无论是'A'
、65
、0b1000001
还是0x41
,它们在编译器看来都是一样的。Enum.Parse
只接受第二种写入方式。
要将字符'A'
转换为枚举类型MyEnum
,只需要一个强制转换:
MyEnum foo = (MyEnum)'A';
但是,由于这里有一个字符串"A"
,您需要获得第一个字符(假设您确信该字符串代表一个相关的常数值(:
MyEnum foo = (MyEnum)"A"[0];