考虑下面的枚举:
public enum TestType
{
Mil,
IEEE
}
如何将以下字符串解析为上面的枚举?
在Military 888d Test
的情况下 TestType.Mil
要么
在IEEE 1394
TestType.IEEE
我的想法是检查字符串的第一个字母是否与“Mil”或“IEEE”匹配,然后我将其设置为我想要的枚举,但问题是还有其他不应解析的情况!
答案 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)
修改强>
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");
}
}