2011-07-21 137 views
2

这是一个奇怪的位。请原谅下面的半伪码。我有一个枚举值列表。比方说,例如,像这样:从字符串获取枚举字段

public enum Types 
    { 
     foo = 1, 
     bar = 2, 
     baz = 3 
    } 

这将成为,恭敬,在代码:

Types.foo 
Types.bar 
Types.baz 

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

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" } 

为完整起见:

dropDownListId.Items.Add(li1); dropDownListId.Items.Add(li2); dropDownListId.Items.Add(li3); 

希望大家仍然和我在一起。我想要做的就是在Autopostback上取出字符串“foo”并将其转换为Types.foo - 而不使用开关(因为枚举值是从数据库生成的,可能会更改)。

我希望有道理吗?任何想法从哪里开始?

回答

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 
} 

还有,需要一个布尔值,它允许您指定的情况下不敏感的过载: http://msdn.microsoft.com/en-us/library/dd991317.aspx

Enum.TryParse是在.NET 4的新如果你被困在一个以前的版本,您将不得不使用非类型安全的方法(在转换失败的情况下抛出异常,而不是返回false),如下所示:

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

Enum.Parse对于大小写不敏感也有重载。

+0

中邦,作品一种享受,谢谢:) –

+0

@大卫没问题,不要忘了接受回答! –

0

所以,你想:Enum.Parse(typeof(Types), postbackValue)

还是我错过了什么?