结合扩展方法

时间:2009-09-05 19:54:55

标签: asp.net-mvc vb.net enums extension-methods

我正在尝试编写2种扩展方法来处理Enum类型。一个使用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

所以我的问题是两种扩展方法都不能很好地协同工作。将枚举选项转换为不可数的方法不能使用扩展方法来获取描述。

我找到了所有类型的例子来做其中一个但从未相互结合。我究竟做错了什么?我还不熟悉这些新的.NET 3.5内容。

1 个答案:

答案 0 :(得分: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#中的含义不同。)