我已经定义了一个枚举为blow,它包括int类型和character类型。
我试着把字符串解析成枚举,但在输入字符时出错。
如何解决这个问题?
//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());
}发布于 2021-06-16 19:25:50
这里的问题是枚举实际上是基于Char值的,所以int值被转换为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“或"StatusA”都可以工作。
因此,以下所有行都将返回相同的结果:
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");发布于 2021-06-16 19:27:56
Enum.Parse仅适用于关联常量值的名称或数值。枚举成员的。'A'不是这两个。如果您已经将字符串"65"传递给该方法,那么它就可以工作了。
请注意,如何编写关联的常量值并不重要--无论是'A'、65、0b1000001还是0x41,对于编译器来说,它们看起来都是一样的。Enum.Parse只接受第二种编写方式。
要将字符'A'转换为枚举类型MyEnum,只需进行强制转换:
MyEnum foo = (MyEnum)'A';但是,因为这里有一个字符串"A",所以需要获取第一个字符(假设您确定该字符串表示一个相关的常量值):
MyEnum foo = (MyEnum)"A"[0];https://stackoverflow.com/questions/68001655
复制相似问题