簡體   English   中英

嚴格將字符串解析為枚舉的最佳方法是什么?

[英]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,無論它是否超出范圍。

什么是解析的最佳方法:

  1. 只有字符串值“MyEnum.OptionOne”,“MyEnum.OptionTwo”,“MyEnum.OptionThree”進入其枚舉對應物。
  2. 字符串“MyEnum.OptionOne”,“MyEnum.OptionTwo”,“MyEnum.OptionThree”和0,2和4的值分別分別為MyEnum.OptionOne,MyEnum.OptionTwo,MyEnum.OptionThree?

類似問題的鏈接我應該如何將字符串轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM