2009-09-05 60 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