Rubrik: Variablen/Strings | VB-Versionen: VB2008 | 27.04.09 |
Enumerationen: Member auflisten Funktion, die die Werte und Bezeichner einer beliebigen Enumeration in eine Dictionary einträgt | ||
Autor: Manfred Bohn | Bewertung: | Views: 13.264 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Wenn man die Mitglieder eine Enumeration auflisten möchte, z.B. um sie in einem Dialog zur Auswahl anzubieten, kann man die Funktion 'Enum_GetMember' verwenden.
Sie arbeitet für VB-interne, Framework-interne und benutzer-erstellte Enumerationen beliebigen Datentyps.
Die Funktion besitzt zwei Typ-Parameter (nicht zu verwechseln mit Variablen-Parametern!).
Der erste Typ-Parameter ('EnumType') erwartet die Angabe der Enumeration, deren Mitglieder gelistet werden sollen.
Im zweiten Parameter ('ValueType') ist anzugeben, als welcher Datentyp die in der Enumeration enthaltenen Werte zurückgegeben werden.
Enumerationswerte können beliebige Ganzzahl-Typen (von Byte bis ULong) sein. Der angeforderte 'ValueType' braucht nicht dem Daten-Typ der Enumerations-Werte zu entsprechen, er muss die Werte-Spannweite aber aufnehmen können (Erweiterungs-Konvertierung).
Die Funktion füllt eine 'Dictionary', die die numerischen Werte ('TKey') und die zugehörigen String-Kennungen ('TValue') der Enumeration enthält. Der 'TKey'-Typparameter der 'Dictionary' muss dem 'ValueType'-Parameter der Funktion 'Enum_GetMember' entsprechen.
Falls die Routine scheitert (z.B. unbrauchbarer 'EnumType', numerischer Überlauf des 'ValueType'), wird 'Nothing' zurückgegeben. (Die 'Constraint' der Typparameter ['Structure'] ist nicht hinreichend einschränkend. Der Programmierer muss deshalb selbst darauf achten, im ersten Parameter eine Enumeration und im zweiten einen geeigneten Ganzzahl-'Primitive' anzugeben.)
Das klingt alles vielleicht ein wenig verwirrend, ist aber in der Anwendung einfach.
Der Namespace 'System' muss importiert werden. Alles weitere ist im Code qualifiziert.
''' <summary>Enumerations-Member auflisten</summary> ''' <typeparam name="EnumType">Enumeration (Typ)</typeparam> ''' <typeparam name="ValueType"> ''' Datentyp der numerischen Enumerations-Werte</typeparam> ''' <returns>Dictionary mit den Enumerations-Werten (Typ wählbar) ''' und den Bezeichnern/Namen (Typ: String)</returns> Public Function Enum_GetMembers ( _ Of EnumType As Structure, ValueType As Structure)() _ As Collections.Generic.Dictionary(Of ValueType, String) Try ' Alle Werte der Enumeration abfragen Dim values As EnumType() = _ CType(Convert.ChangeType _ (Enum.GetValues(GetType(EnumType)), _ GetType(EnumType())), EnumType()) If values.Length < 1 Then Return Nothing Dim val_str As String, val_out As ValueType ' Rückgabe-Dictionary erstellen Dim dic As New Collections.Generic.Dictionary(Of ValueType, String) ' Enumerations-Werte durchlaufen For Each Value As EnumType In values ' den aktuellen Enumerations-Wert ' in den geforderten 'ValueType' wandeln val_out = CType(Convert.ChangeType(Value, GetType(ValueType)), ValueType) ' Kennzeichner/Namen zum Enumerations-Wert abfragen val_str = Enum.GetName(GetType(EnumType), Value) ' ... und Wert + Namen in der Dictionary anhängen dic.Add(val_out, val_str) Next Value Return dic Catch Return Nothing End Try End Function
Anwendungsbeispiele:
Alle Abfragen fordern für die Enumerationswerte den DatenTyp 'Long'.
Das leere Klammerpaar im Funktionsaufruf kennzeichnet die nicht vorhandenen Variablen-Parameter der Funktion.
Private Enum enm_prog As Byte a = 0 b = 127 c = 255 End Enum
' Deklaration der Dictionary Dim dic As Collections.Generic.Dictionary(Of Long, String) ' eine Framework-Enumeration dic = Enum_GetMembers(Of Globalization.NumberStyles, Long)() ' eine VB-Enumeration dic = Enum_GetMembers(Of Microsoft.VisualBasic.FirstDayOfWeek, Long)() ' eine programmierte Enumeration (siehe oben) dic = Enum_GetMembers(Of enm_prog, Long)()
' Ausgabe des Dictionary-Inhaltes im Output-Fenster For Each kvp As Collections.Generic. _ KeyValuePair(Of Long, String) In dic Console.Write("Name = " & kvp.Value & _ " Wert = " & CStr(kvp.Key) & Microsoft.VisualBasic.vbCrLf) Next kvp