none
Ganze Enums an Funktion übergeben RRS feed

  • Frage

  • Hallo,

    ich möchte eine Function haben, an der ich eine komplette x-beliebige Enum-Liste übergeben kann. Also nicht "nur" einen einzelnen Wert, sondern "irgendeine" komplette Enumeration.

    Ziel ist es, dass mir die Funktion alle Enum-Variablen (inkl. Namen und Wert) als Liste zurückliefert. Zur Verdeutlichung habe ich einen kleinen Quellcode angefügt wie ich mir das ungefähr vorstelle.

    Mein Problem ist: Ich weiß nicht wie ich jede x-beliebige Enumeration an die Funktion übergebe, damit das funktioniert :-/ Ich habe es mit As Object probiert, mit As Type, As Enum etc.

    Hier mein "Phantasie"-Quellcode :-)

        Public Enum TestEnum
            Name1 = 1
            Name2 = 3
            HalloWelt = 12
        End Enum
    
        Private Sub Test()
    
            Dim x As List(Of EnumItem) = GetNameAndValues(TestEnum)
    
        End Sub
    
        Public Function GetNameAndValues(e1 As Object) As List(Of EnumItem)
    
            Dim res As New List(Of EnumItem)
    
            Dim typ As Type = GetType(e1)
            Dim fields As FieldInfo() = typ.GetFields
    
            For Each field In fields
                If field.Name.Equals("value__") Then Continue For
    
                Dim x As New EnumItem
                x.Name = field.Name
                x.Value = field.GetRawConstantValue()
                res.Add(x)
    
            Next
    
            Return res
    
        End Function
    
        Public Class EnumItem
    
            Private _Name As String = ""
            Private _Value As Integer = 0
    
            ''' <summary>
            ''' Name des Enum-Feldes
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Name As String
                Get
                    Return _Name
                End Get
                Set(value As String)
                    _Name = value
                End Set
            End Property
    
            ''' <summary>
            ''' Wert des Enum-Feldes
            ''' </summary>
            ''' <value></value>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Property Value As Integer
                Get
                    Return _Value
                End Get
                Set(value As Integer)
                    _Value = value
                End Set
            End Property
        End Class
    

    Kann mir bitte da jemand auf die Sprünge helfen?

    Vielen lieben dank
    Gruß
    Andy

    Montag, 11. Februar 2013 08:18

Antworten

  • Hallo Andy,

    Enum hat das zu guten Teilen bereits eingebaut. Eine Methode in der Zusammensetzung gibt es nicht, weil das Ergebnis nicht in jedem Falle eindeutig ist, nämlich wenn man ein Enum mit FlagsAttribute hat. Kann man damit leben und beschränkt sich auf Integer-Enumerationen, sähe das z. B. so aus:

        Public Shared Function GetEnumNameAndValues(enumType As Type) As KeyValuePair(Of Integer, String)()
            Dim items As New List(Of KeyValuePair(Of Integer, String))
            For Each value As Integer In [Enum].GetValues(enumType)
                items.Add(New KeyValuePair(Of Integer, String)(value, [Enum].GetName(enumType, value)))
            Next
            Return items.ToArray()
        End Function

    Und als Beispiel:

            For Each item In GetEnumNameAndValues(GetType(System.IO.FileAttributes))
                Console.WriteLine("{0} = {1}", item.Key, item.Value)
            Next
    

    Die Einschränkung auf Integer (oder kleiner) könnte man durch eine generische Methode aufheben, was das Ganze eher unhandlicher macht.

    Alternativ zu KeyValuePair könnte man Tuple verwenden oder wie Du oben eine eigene Klasse erfinden.

    Gruß Elmar

    • Als Antwort markiert AndreasMahub Dienstag, 12. Februar 2013 19:44
    Montag, 11. Februar 2013 09:55
    Beantworter

Alle Antworten