Konvertiere Enum in eine Datatable als Extension

    • VB.NET
    • .NET (FX) 4.0

      Konvertiere Enum in eine Datatable als Extension

      In meinen Projekt verwende ich häufig Enums. Nun wäre es ganz praktisch, diese auch in z.B. Comboboxen zu verwenden.
      Ich habe daher eine Extension erstellt, die eine beliebige Enum in eine Datatable umwandelt:
      • Die Enum darf beliebige ganzzahlige Typen annehmen
      • Die zurückgegebene Datatable enthält 2 Spalten:
        Datacolumn "Value" mit dem Wert des Enumerationseintrages
        Datacolumn "Description" mit der Beschreibung des Wertes als Text.
      • Der jeweilige Enum-Wert kann mit einem System.ComponentModel.DescritionAttribute dekoriert werden.
        Diese Angabe wird dann als beschreibender Text übernommen.
      • Ist ein solches Attribut nicht angegeben, so wird der als Text der Name des Enum-Eintrages verwendet.
        Etwa vorhandene Unterstriche im Namen werden in Leerzeichen umgewandelt.

      Die Extension ist nachstehend aufgeführt. Interessant ist dabei die Angabe von Namespace Global.System. Damit ist, losgelöst vom aktuellen Namespace, eine Erweiterung anderer Namespaces möglich:

      VB.NET-Quellcode

      1. Imports System.Runtime.CompilerServices
      2. Imports System.ComponentModel
      3. Namespace Global.System
      4. Public Module GlobalSystemEnumToDatatable
      5. ''' <summary>
      6. ''' Umwandlung eines Enum-Typen in eine Datatable. Alle ganzzahligen Typen werden unterstützt.
      7. ''' </summary>
      8. ''' <param name="EnumType"> Der Type der Enum, erstellt aus z.B. Gettype(MyEnum)</param>
      9. ''' <returns>Eine Datatable mit den Spalten "Value", die den ganzzahligen Wert des jeweilgen Enum-Wertes enthält,
      10. ''' und die Spalte "Description" mit dem beschreibenden Text.</returns>
      11. <Extension()> _
      12. Public Function ToDataTable(EnumType As System.Type) As DataTable
      13. If Not EnumType.IsEnum Then
      14. Throw New TypeAccessException(String.Format("{0}: Ungültige Verwendung. Die Erweiterung darf nur auf den Type System.Enum angewendet werden.", EnumType.ToString))
      15. End If
      16. Dim dt As DataTable = New DataTable(EnumType.ToString)
      17. dt.Columns.Add("Value", [Enum].GetUnderlyingType(EnumType))
      18. dt.Columns.Add("Description", GetType(System.String))
      19. For Each name As String In [Enum].GetNames(EnumType)
      20. dt.Rows.Add({[Enum].Parse(EnumType, name), GetEnumDescription(EnumType, name)})
      21. Next
      22. Return dt
      23. End Function
      24. ''' <summary>
      25. ''' Helferfunktion zum Ermitteln des den Enum-Werteses beschreibenden Textes.
      26. ''' </summary>
      27. ''' <param name="EnumType"> Der Type der zu untersuchenden Enum</param>
      28. ''' <param name="value"> Der Name des zu untersuchenden Wertes</param>
      29. ''' <returns>Ein den Enum-Eintrag beschreibender Text</returns>
      30. ''' <remarks>Der beschreibende Text wird aus dem Namen des Enum-Wertes abgeleitet. Unterstriche werden dabei in Leerzeichen konvertiert.
      31. ''' Ist der Wert mit System.ComponentModel.Descritionattribute dekoriert, so wird der Wert dieses Attributes zurückgegeben.</remarks>
      32. Private Function GetEnumDescription(EnumType As Type, value As String) As String
      33. Dim customAttribute = EnumType.GetField(value).GetCustomAttributes(GetType(DescriptionAttribute), False)
      34. Return If(customAttribute.Length > 0, DirectCast(customAttribute(0), DescriptionAttribute).Description, value.Replace("_"c, " "c))
      35. End Function
      36. End Module
      37. End Namespace


      Die Benutzung ist recht trivial:

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Public Class Form1
      3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      4. Dim dgv As New DataGridView With {.Size = New Size(400, 200), .Location = New Point(20, 20), .Parent = Me, .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill}
      5. dgv.DataSource = GetType(MyEnum).ToDataTable.DefaultView
      6. End Sub
      7. End Class
      8. Public Enum MyEnum As ULong
      9. Null_mit_anderem_Wert = 4711
      10. Eins
      11. Zwei
      12. <Description("Der 3. Eintrag")> Drei
      13. Vier
      14. End Enum