从字符串中获取枚举字段

Dav*_*her 2 c# asp.net enums webforms

这有点奇怪.请原谅下面的半伪代码.我有一个枚举值列表.比如说,就像这样:

public enum Types
    {
       foo = 1,
       bar = 2,
       baz = 3
    }
Run Code Online (Sandbox Code Playgroud)

尊敬地,这将成为代码:

Types.foo
Types.bar
Types.baz
Run Code Online (Sandbox Code Playgroud)

现在我有一个下拉列表,其中包含以下列表项:

var li1 = new ListItem() { Key = "foo" Value = "Actual Representation of Foo" }
var li2 = new ListItem() { Key = "bar" Value = "Actual Representation of Bar" }
var li3 = new ListItem() { Key = "baz" Value = "Actual Representation of Baz" }
Run Code Online (Sandbox Code Playgroud)

为了完整起见:

dropDownListId.Items.Add(li1); dropDownListId.Items.Add(li2); dropDownListId.Items.Add(li3);
Run Code Online (Sandbox Code Playgroud)

希望每个人都和我在一起.我想要做的是在Autopostback上取字符串"foo"并将其转换为Types.foo - 不使用开关(因为枚举值是从数据库生成的,可能会更改).

我希望这是有道理的?知道从哪里开始?

Eti*_*tel 6

当然:

Types t;
if(Enum.TryParse(yourString, out t)) // yourString is "foo", for example
{
    // use t
}
else
{
    // yourString does not contain a valid Types value
}
Run Code Online (Sandbox Code Playgroud)

还有一个重载,它带有一个允许你指定不区分大小写的布尔值:http: //msdn.microsoft.com/en-us/library/dd991317.aspx

Enum.TryParse是.NET 4中的新功能.如果您遇到以前的版本,则必须使用非类型安全Enum.Parse方法(在转换失败的情况下抛出异常,而不是返回false),如下所示:

try
{
    Types t = (Types)Enum.Parse(typeof(Types), yourString);
    // use t
}
catch(ArgumentException)
{
    // yourString does not contain a valid Types value
}
Run Code Online (Sandbox Code Playgroud)

Enum.Parse 对于不区分大小写也有过载.