views:

178

answers:

1

I'm trying to write 2 extension methods to handle Enum types. One to use the description attribute to give some better explanation to the enum options and a second method to list the enum options and their description to use in a selectlist or some kind of collection.

You can read my code up to now here:

    <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

So my problem is both extension methods don't work that well together. The methods that converts the enum options to an ienumerable can't use the extension method to get the description.

I found all kind of examples to do one of both but never in combination with each other. What am I doing wrong? I still new to these new .NET 3.5 stuff.

+2  A: 

The problem is that Enum.GetValues just returns a weakly typed Array.

Try this:

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

(It looks like explicitly typed range variables in VB queries don't mean the same thing as in C#.)

Jon Skeet
I tried doing that but then I get this error: "Option Strict On disallows implicit conversions from 'Object' to 'System.Enum'." on the "As Enum" part.
Stief Dirckx
Okay, fixing...
Jon Skeet