0

考虑下面的枚举:

public enum TestType
{
    Mil,
    IEEE
}

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

Military 888d Test如果是TestType.Mil 或者 IEEE 1394如果是TestType.IEEE

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

4

6 回答 6

2

我已经回答了:如何在 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#

于 2012-07-16T10:00:31.027 回答
1

我对您的情况的理解是字符串可以采用任何格式。您可以使用诸如“Military 888d Test”、“Mil 1234 Test”、“Milit xyz SOthing”之类的字符串...

在这种情况下,简单的 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

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

于 2012-07-16T10:15:46.777 回答
0

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

于 2012-07-16T09:57:34.907 回答
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 及更高版本。

于 2012-07-16T10:01:15.497 回答
0

请尝试这种方式

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

然后你想比较字符串

bool result = testType.ToString() == "IEEE";
于 2012-07-16T10:02:20.497 回答
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");
   }
}
于 2012-07-16T10:08:04.897 回答