[英]What is the best way to strictly parse string to enum?
假設我有一個枚舉:
public enum MyEnum
{
OptionOne = 0,
OptionTwo = 2,
OptionThree = 4
}
就像我在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,無論它是否超出范圍。
什么是解析的最佳方法:
類似問題的鏈接我應該如何將字符串轉換為C#中的枚舉? 對提供的測試沒有幫助 - 它仍然將字符串轉換為整數,即使它們不在枚舉范圍內。
您可以使用Enum.GetValues(Type enumType)
自己完成此操作。
public static MyEnum? ParseEnum(string input)
{
return (MyEnum?) Enum.GetValues(typeof(MyEnum)).OfType<object>()
.FirstOrDefault(v => v.ToString() == input);
}
添加對整數的支持,您也可以添加。
public static MyEnum? ParseEnum(string input)
{
int value;
var isInt = int.TryParse(input, out value);
return (MyEnum?) Enum.GetValues(typeof(MyEnum)).OfType<object>()
.FirstOrDefault(v => v.ToString() == input
|| (isInt & (int)v == value));
}
由於我不是100%確定您的上一個要求,因此我添加一個包含該名稱的內容並且更通用
public static T? ParseEnum<T>(string input)
where T : struct
{
int value;
var isInt = int.TryParse(input, out value);
return (T?)Enum.GetValues(typeof(T)).OfType<object>()
.FirstOrDefault(v => v.ToString() == typeof(T).Name + input
|| (isInt & (int)v == value));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.