【发布时间】:2016-04-12 20:57:25
【问题描述】:
假设我有一个枚举:
public enum MyEnum
{
OptionOne = 0,
OptionTwo = 2,
OptionThree = 4
}
就像在How should I convert a string to an enum in C#? 问题中所说的那样,我使用Enum.Parse 方法从字符串中解析枚举:
public class Enumer
{
public static MyEnum? ParseEnum(string input)
{
try
{
return (MyEnum) Enum.Parse(typeof (MyEnum), input);
}
catch (ArgumentException)
{
return null;
}
}
}
不幸的是,对于表示为字符串的整数,它不能按预期工作。
我不希望 Parse.Enum() 将 int 从字符串转换,但实际上确实如此。
一个简单的测试:
[TestClass]
public class Tester
{
[TestMethod]
public void TestEnum()
{
Assert.AreEqual(MyEnum.OptionTwo, Enumer.ParseEnum("OptionTwo"));
Assert.IsNull(Enumer.ParseEnum("WrongString"));
Assert.IsNull(Enumer.ParseEnum("2")); // returns 2 instead of null
Assert.IsNull(Enumer.ParseEnum("12345")); // returns 12345 instead of null
}
}
只能通过四项中的两项检查。Enumer.ParseEnum("2") 返回 MyEnum.OptionTwo 而不是 null。
此外,Enumer.ParseEnum("12345") 返回 12345,不管它是否超出范围。
什么是最好的解析方式:
- 仅将“MyEnum.OptionOne”、“MyEnum.OptionTwo”、“MyEnum.OptionThree”的字符串值放入对应的枚举中。
- 字符串“MyEnum.OptionOne”、“MyEnum.OptionTwo”、“MyEnum.OptionThree”,并将 0、2 和 4 的值分别输入到 MyEnum.OptionOne、MyEnum.OptionTwo、MyEnum.OptionThree 中?
类似问题How should I convert a string to an enum in C#? 的链接对提供的测试没有帮助 - 它仍然将字符串转换为整数,即使它们超出了枚举范围。
【问题讨论】:
-
@ErkanDemirel,据我了解,这个问题是关于 Enum.Parse() 语法本身的。
-
@Kolky 你误解了这个问题。我不想将“12345”解析为 12345,但 Enum.Parse 可以。
-
感觉你没看帖子。
-
抱歉,误读了您最后的陈述。