2009-09-05 72 views
1

我想寫2擴展方法來處理枚舉類型。一種是使用description屬性給枚舉選項提供一些更好的解釋,另一種是列舉枚舉選項及其描述以用於選擇列表或某種集合中。結合擴展方法

你可以閱讀我的代碼到現在的位置:

<Extension()> _ 
    Public Function ToDescriptionString(ByVal en As System.Enum) As String 

     Dim type As Type = en.GetType 
     Dim entries() As String = en.ToString().Split(","c) 
     Dim description(entries.Length) As String 

     For i = 0 To entries.Length - 1 
      Dim fieldInfo = type.GetField(entries(i).Trim()) 
      Dim attributes() = DirectCast(fieldInfo.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute()) 

      description(i) = If(attributes.Length > 0, attributes(0).Description, entries(i).Trim()) 
     Next 

     Return String.Join(", ", description) 

    End Function 

    <Extension()> _ 
    Public Function ToListFirstTry(ByVal en As System.Enum) As IEnumerable 

     Dim type As Type = en.GetType 

     Dim items = From item In System.Enum.GetValues(type) _ 
      Select New With {.Value = item, .Text = item.ToDescriptionString} 

     Return items 

    End Function 

    <Extension()> _ 
    Public Function ToListSecondTry(ByVal en As System.Enum) As IEnumerable 

     Dim list As New Dictionary(Of Integer, String) 
     Dim enumValues As Array = System.Enum.GetValues(en.GetType) 

     For Each value In enumValues 
      list.Add(value, value.ToDescriptionString) 
     Next 

     Return list 

    End Function 

所以我的問題是,這兩種擴展方法不工作是很好。將枚舉選項轉換爲ienumerable的方法不能使用擴展方法來獲取描述。

我發現所有類型的例子都做了兩者之一,但從來沒有結合在一起。我究竟做錯了什麼?我仍然對這些新的.NET 3.5的東西很陌生。

回答

2

問題是Enum.GetValues只是返回弱類型Array

試試這個:

Public Function ToListFirstTry(ByVal en As System.Enum) As IEnumerable 

    Dim type As Type = en.GetType 

    Dim items = From item In System.Enum.GetValues(type).Cast(Of Enum)() _ 
     Select New With {.Value = item, .Text = item.ToDescriptionString} 

    Return items 

End Function 

(它看起來像VB中的查詢顯式類型範圍變量並不意味着同樣的事情,在C#)。

+0

我想這樣做,但後來我得到這個錯誤:「Option Strict On禁止從'Object'到'System.Enum'的隱式轉換。」在「作爲枚舉」部分。 – 2009-09-05 20:17:41

+0

好的,修復... – 2009-09-05 20:23:35