2014-01-23 34 views
1

我想循環訪問我的枚舉並從中提取值,字符串和說明?我怎樣才能做到這一點?如何獲取枚舉值,字符串和說明

Enum Fruits 
     <Description("$1.99/lb")> Apple = 1 
     <Description("$0.99/lb")> Banana= 2 
     <Description("$3.99/lb")> Orange= 3 
End Enum 

Persudo代碼

For Each item in Fruits 
    Dim value as integer 
    Dim text as string 
    Dim description as string 
    Dim returnText = String.Format("ID: {0} {1} is {2}", value, text, description) 
Next 

我會想得:

ID:1蘋果爲$ 1.99 /磅

ID:2香蕉爲$ 0.99 /磅

ID:3橙色是$ 3.99 /磅

謝謝你的幫助。

回答

1

這是一個非常糟糕的管理數據元素的方法:每次香蕉價格上漲時,您都必須更改代碼。說明應該保留給靜態項目。例如:

Friend Enum ImgSizes 
    <Description("Large, 1600x900")> Lg = 1600    
    <Description("Medium, 1280x720")> Med = 1280 
    <Description("Small, 720x480")> Sm = 720 
End Enum 

在這裏,描述可能會被提取顯示在組合框中以提供友好的翻譯。否則,value只是枚舉的整數值,名稱可以從.ToString獲得。唯一的技巧是描述:

Shared Function GetDescription(ByVal EnumConstant As [Enum]) As String 
    Dim fi As FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString()) 
    Dim attr() As DescriptionAttribute = DirectCast(
     fi.GetCustomAttributes(GetType(DescriptionAttribute), False), 
      DescriptionAttribute()) 
    If attr.Length > 0 Then 
     Return attr(0).Description 
    Else 
     Return EnumConstant.ToString() 
    End If 
End Function 

您的循環需要工作,您需要使用OPTION STRICT。循環訪問值以獲取所需的信息。索引變量必須是As Fruits否則它不是Enum/Friuts,而是一個整數或對象,什麼都不會起作用。

For Each v As Fruit In [Enum].GetValues(GetType(Fruits)) 
    returnText = String.Format("ID: {0} {1} is {2}", 
      Convert.ToInt32(v), v.ToString, 
      GetDescription(GetType(v)) 
Next 
+0

1. v.value向我拋出一個錯誤,指出「value」不是成員。 –

+0

你說得對,這是管理數據元素的一種不好的方法,幸運的是,這些只是虛擬數據。 :)我在2分鐘內想出了一些東西。我想我應該對此進行更多的考慮。 –

+0

我的錯誤複製了太多的代碼。它應該只是'Convert.ToInt32(v)'PLUS桔子太貴了;) – Plutonix