繁体   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