Aufzählungstypen im Visier (Teil 4)
Kommentare

Gibt es eine Möglichkeit, um explizite Typumwandlung und Programmierung über statische Methoden auf der Enum-Klasse zu vermeiden? Ein eleganter Ausweg ist die Verwendung von Erweiterungsmethoden. Auf

Gibt es eine Möglichkeit, um explizite Typumwandlung und Programmierung über statische Methoden auf der Enum-Klasse zu vermeiden? Ein eleganter Ausweg ist die Verwendung von Erweiterungsmethoden. Auf jeder konkreten Enumeration können Sie leicht Erweiterungsmethoden definieren (Listing 4).

Listing 4

public static class MatchStatusExtensions
{
     public static Int32 AsInt32(this MatchStatus value)
     {
         return (Int32) value;
     }
}  

Die Methode AsInt32 übernimmt einen beliebigen Wert der Enumeration MatchStatus und wandelt ihn in einen Int32 um. Hinsichtlich der Funktionalität keine große Sache, doch jetzt lässt sich sauberer Code wie folgt kompilieren:

var status = MatchStatus.Completed; Console.WriteLine(status.AsInt32()); 

Gehen wir zurück zum ersten Problem, das bei Enumerationen aufgetaucht ist: Wie lässt sich die Beschreibung der Werte in der Liste steuern? Jedem Wert können Sie ein Attribut zuordnen und dann diese Werte über eine Erweiterungsmethode abrufen (Listing 5).

Listing 5

public enum MatchStatus : int
{
    [Description("To be played")]
    ToBePlayed,
    BeingCurrentlyPlayed,
    Completed 
}  

Zwar ist hier jedes beliebige Attribut möglich, doch gibt es meiner Meinung nach keinen Grund, nicht das native Description-Attribut von System.ComponentModel zu verwenden. Es ist nicht einmal notwendig, jedem Wert in der Enumeration ein Attribut zuzuweisen. Versehen Sie einfach die Werte damit, für die Sie es für sinnvoll erachten. Wie lässt sich die Beschreibung abrufen? Und vor allem, wie lässt sie sich abrufen, ohne die Erweiterungsmethode für jede Enumeration neu zu erzeugen? Hierzu können Sie wie in Listing 6 verfahren.

Listing 6

public static String GetDescription(this MatchStatus val)
{
    var field = val.GetType().GetField(val.ToString());
    var attributes = (DescriptionAttribute[])
          field.GetCustomAttributes(typeof(DescriptionAttribute), false);
    return attributes.Length > 0 ? attributes[0].Description : val.ToString();
}  
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -