在 Enum 中搜索字符串并返回 Enum

我列举了一下:

public enum MyColours
{
Red,
Green,
Blue,
Yellow,
Fuchsia,
Aqua,
Orange
}

我有一根绳子:

string colour = "Red";

我希望能够返回:

MyColours.Red

来自:

public MyColours GetColour(string colour)

到目前为止:

public MyColours GetColours(string colour)
{
string[] colours = Enum.GetNames(typeof(MyColours));
int[]    values  = Enum.GetValues(typeof(MyColours));
int i;
for(int i = 0; i < colours.Length; i++)
{
if(colour.Equals(colours[i], StringComparison.Ordinal)
break;
}
int value = values[i];
// I know all the information about the matched enumeration
// but how do i convert this information into returning a
// MyColour enumeration?
}

如你所见,我有点卡住了。是否可以通过值选择枚举数。比如:

MyColour(2)

会导致

MyColour.Green
152943 次浏览

您可以将 int 转换为枚举

(MyColour)2

还有 Enum.Parse 选项

(MyColour)Enum.Parse(typeof(MyColour), "Red")

可以使用 Enum.Parse从名称中获取枚举值。您可以使用 Enum.GetNames迭代所有值,并且只需将整型转换为枚举即可从整型值获取枚举值。

比如这个:

public MyColours GetColours(string colour)
{
foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
if (mc.ToString().Contains(colour)) {
return mc;
}
}
return MyColours.Red; // Default value
}

或:

public MyColours GetColours(string colour)
{
return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}

如果找不到值,后者将抛出 ArgumentException,您可能希望在函数内捕获它并返回默认值。

你只需要 枚举,解析

检出 System.Enum 解析:


enum Colors {Red, Green, Blue}


// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");

正如前面的答案中提到的,您可以直接强制转换为基础数据类型(int-> enum 类型)或解析(string-> enum 类型)。

但是要小心,没有。为枚举尝试 Parse,因此您需要在解析周围设置 try/catch 块来捕捉失败。

你可能也想看看这篇博文中的一些建议: 我的新朋友,Enum < T >

这篇文章描述了一种创建一个非常简单的通用助手类的方法,它可以让你避免 Enum.Parse固有的丑陋的强制转换语法——相反,你最终会在代码中写下这样的东西:

MyColours colour = Enum<MyColours>.Parse(stringValue);

或者查看同一篇文章中的一些评论,这些评论谈到使用扩展方法来实现类似的功能。

class EnumStringToInt // to search for a string in enum
{
enum Numbers{one,two,hree};
static void Main()
{
Numbers num = Numbers.one; // converting enum to string
string str = num.ToString();
//Console.WriteLine(str);
string str1 = "four";
string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
try
{
for (int i = 0; i <= getnum.Length; i++)
{
if (str1.Equals(getnames[i]))
{
Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
Console.WriteLine("string found:{0}", num1);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Value not found!", ex);
}
}
}

我标记了 OregonGhost 的答案 + 1,然后我尝试使用迭代,意识到它不太正确,因为 Enum。GetNames 返回字符串。你想要 Enum。价值观:

public MyColours GetColours(string colour)
{
foreach (MyColours mc in Enum.GetValues(typeof(MyColours)))
if (mc.ToString() == surveySystem)
return mc;


return MyColors.Default;
}

对您可能有用的一件事(除了目前已经提供的有效/好的答案之外)是提供了 给你的 StringEnum 思想

通过这种方法,您可以将您的枚举定义为类(示例在 vb.net 中) :

< StringEnumRegisteredOnly () , ImmutableObject (True) > 公共 Not 可继承类 EAuthenticationMethod 继承 StringEnumBase (Of 电子认证方法)

Private Sub New(ByVal StrValue As String)
MyBase.New(StrValue)
End Sub


< Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")


< Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")

最后一节课

现在您可以像使用枚举一样使用这个类: eAuthenticationMethod。WindowsAuthentication,这实际上就像给‘ W’赋予 视窗认证的逻辑值(在枚举内部) ,如果你要从属性窗口(或者其他使用系统的东西)查看这个值。组件模型。描述属性)你会得到“ 使用 Windows 身份验证”。

我已经使用它很长时间了,它使代码的意图更加清晰。

(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0

考虑到.NET (+ Core)和 C # 7的最新和最大的变化,以下是最佳解决方案:

var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);

颜色变量可以在 Enum.TryParse 的范围内使用

var color =  Enum.Parse<Colors>("Green");

试试这个方法。

public static class Helper
{
public static T FromStr<T>(string str) where T : struct, System.Enum
=> System.Enum.TryParse<T>(value:str,ignoreCase:true,result:out var result)
? result
: default;
public static T? FromStrNull<T>(string str) where T : struct, System.Enum
=> System.Enum.TryParse<T>(value: str,ignoreCase: true,result: out var result)
? result
: null;
}

像这样使用它

var color = Helper.FromStr<MyColours>("red");