HowTo: VB .NET Enums mit Beschreibungen versehen

Dieses HowTo beschreibt, wie man Enums mit Beschreibungen versehen kann und diese Beschreibungen dann beispielsweise in einer Combobox oder Listbox anzeigt.

Beispiel vorher:

So sehen die Einträge bisher aus. Für den Endanwender ziemlich unpraktisch.

Beispiel nachher:

So sollen die Einträge später angezeigt werden.

Auf gehts!

Unser Beispiel enum:

Public Enum eFileListActionType
  eflatNone = 0
  eflatCompress = 1
  eflatDeleteForever = 2
  eflatRecyclebin = 3
  eflatReplaceWithTextfile = 4
  eflatReplaceWithLink = 5
  eflatReplaceWithZeroByteFile = 6
  eflatMoveToDirectory = 7
End Enum

Um nun alle Namen diesse Enums beispielsweise in einer Combobox anzuzeigen, kann man bekanntermaßen folgendes machen:

Me.cbFileActionType.Items.AddRange([Enum].GetNames(GetType(eFileListActionType)))

Dann hätte man die Combobox mit den Werten eflatNone, eflatCompress usw. usf. gefüllt. Also praktisch so wie im ersten Bild oben. Dass das für den Endanwender nicht unbedingt ideal ist, sollte klar sein. Was wir also benötigen ist eine Möglichkeit den enums eine Beschreibung zu verpassen und diese Beschreibung stattdessen in die Combobox zu schreiben.

Zum Glück gibt es Reflection und das Attribut Description, das uns hierbei aus der Patsche hilft.

Also, wie geht das jetzt?

Zuerst müssen wir unseren enum um das Attribut Description ergänzen. Das sieht dann wie folgt aus:

Imports System.ComponentModel ' Wichtig!

Public Enum eFileListActionType
  <Description("Keine")> _
  eflatNone = 0
  <Description("Komprimieren")> _
  eflatCompress = 1
  <Description("Für immer löschen")> _
  eflatDeleteForever = 2
  <Description("In Papierkorb verschieben")> _
  eflatRecyclebin = 3
  <Description("Durch Textdatei mit Link ersetzen")> _
  eflatReplaceWithTextfile = 4
  <Description("Durch Dateilink ersetzen")> _
  eflatReplaceWithLink = 5
  <Description("Durch 0-Byte Datei ersetzen")> _
  eflatReplaceWithZeroByteFile = 6
  <Description("In Verzeichnis verschieben")> _
  eflatMoveToDirectory = 7
End Enum

Wie man sieht wird einfach der Tag vor einen Eintrag gesetzt.

Zum Auslesen dieser Werte müssen wir nun Reflection bemühen:

Die erste Funktion gibt uns dabei eine Beschreibung für einen Enum-Wert zurück.

Public Shared Function GetEnumDescription(ByVal EnumConstant As [Enum]) As String
    Dim fi As Reflection.FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
    Dim attr() As System.ComponentModel.DescriptionAttribute = DirectCast(fi.GetCustomAttributes(GetType(System.ComponentModel.DescriptionAttribute), False), System.ComponentModel.DescriptionAttribute())
    If attr.Length > 0 Then
      Return attr(0).Description
    Else
      Return EnumConstant.ToString()
    End If
  End Function

Für folgenden Befehl

Dim str as String = GetEnumDescription(eflatReplaceWithTextfile)
Debug.Print(str)

bekämen wir also das als Ausgabe:

Durch Textdatei mit Link ersetzen

Um das ganze noch etwas zu optimieren habe ich noch eine Hilfs-Funktion geschrieben, die alle Werte eines Enums übersetzt (also die Description einliest) und diese in ein String Array schreibt, das man dann einfach an die Combobox übergeben kann.

Public Shared Function GetEnumDescriptions(ByVal EnumConstant As Type) As String()
    Dim res(-1) As String
    For Each ec As [Enum] In [Enum].GetValues(EnumConstant)
      ReDim Preserve res(UBound(res) + 1)
      res(UBound(res)) = GetEnumDescription(ec)
    Next
    Return res
  End Function

Beispielanwendung:

Me.cbFileActionType.Items.AddRange(GetEnumDescriptions(GetType(eFileListActionType)))

Und damit hätten wir alle Beschreibungen eines Enums sauber in einer Combobox oder Listbox untegebracht.


0 Antworten zu HowTo: VB .NET Enums mit Beschreibungen versehen

  1. Bisher gibt es keine Kommentare.