将字符串解析为枚举

时间:2012-07-16 09:56:06

标签: c# parsing enums

考虑下面的枚举:

public enum TestType
{
    Mil,
    IEEE
}

如何将以下字符串解析为上面的枚举?

Military 888d Test的情况下

TestType.Mil 要么 在IEEE 1394

的情况下TestType.IEEE

我的想法是检查字符串的第一个字母是否与“Mil”或“IEEE”匹配,然后我将其设置为我想要的枚举,但问题是还有其他不应解析的情况!

6 个答案:

答案 0 :(得分:2)

我已经回答:How to set string in Enum C#?

枚举不能是字符串,但你可以附加属性,你可以读取枚举的值如下....................

public enum TestType
{
      [Description("Military 888d Test")]
     Mil,
      [Description("IEEE 1394")]
     IEEE
 }



public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

如果你想通过它,那么这篇文章很好:Associating Strings with enums in C#

答案 1 :(得分:1)

我对你的情况的理解是字符串可以是任何格式。你可以拥有“军事888d测试”,“Mil 1234测试”,“Milit xyz SOmething”等字符串...

在这种情况下,简单的Enum.Parse无法提供帮助。您需要确定Enum的每个值,您希望允许哪些组合。请考虑以下代码......

public enum TestType
{
    Unknown,
    Mil,
    IEEE
}

class TestEnumParseRule
{
    public string[] AllowedPatterns { get; set; }
    public TestType Result { get; set; }
}


private static TestType GetEnumType(string test, List<TestEnumParseRule> rules)
{
    var result = TestType.Unknown;
    var any = rules.FirstOrDefault((x => x.AllowedPatterns.Any(y => System.Text.RegularExpressions.Regex.IsMatch(test, y))));
    if (any != null)
        result = any.Result;

    return result;
}


var objects = new List<TestEnumParseRule>
                  {
                      new TestEnumParseRule() {AllowedPatterns = new[] {"^Military \\d{3}\\w{1} [Test|Test2]+$"}, Result = TestType.Mil},
                      new TestEnumParseRule() {AllowedPatterns = new[] {"^IEEE \\d{3}\\w{1} [Test|Test2]+$"}, Result = TestType.IEEE}
                  };
var testString1 = "Military 888d Test";
var testString2 = "Miltiary 833d Spiral";

var result = GetEnumType(testString1, objects);
Console.WriteLine(result); // Mil

result = GetEnumType(testString2, objects);
Console.WriteLine(result); // Unknown

重要的是用相关的正则表达式或测试填充规则对象。如何将这些值输入数组,实际上取决于你......

答案 2 :(得分:0)

试试这个var result = Enum.Parse(type, value);

答案 3 :(得分:0)

修改

使用Enum.GetNames

foreach (var value in Enum.GetNames(typeof(TestType))) 
{
    // compare strings here
    if(yourString.Contains(value))
    {
        // what you want to do
        ...
    }
}

如果您使用的是.NET4或更高版本,则可以使用Enum.TryParse。并且Enum.Parse可用于.NET2及更高版本。

答案 4 :(得分:0)

请尝试这种方式

    TestType testType;
    Enum.TryParse<TestType>("IEEE", out testType);

你要比较字符串然后

bool result = testType.ToString() == "IEEE";

答案 5 :(得分:0)

简单的方法可以帮到你:

public TestType GetTestType(string testTypeName)
{
   switch(testTypeName)
   {
       case "Military 888d Test":
           return TestType.Mil;
       case "IEEE 1394":
           return TestType.IEEE;
       default:
           throw new ArgumentException("testTypeName");
   }
}