Iteration über Enumerations in C#

In meinem C#-Programm hatte ich das Problem zu lösen, Strings in Typen eines Enums umzuwandeln. Z.B. habe ich eine Enumeration GeschlechtTyp definiert, die wie folgt aussieht:
/// <summary> /// Mögliche Geschlechter. /// </summary> public enum GeschlechtTyp { /// <summary> /// Männer. /// </summary> m, /// <summary> /// Frauen. /// </summary> w }

Jetzt lese ich bestimmte Textdateien ein, in denen das Geschlecht einer Person als String steht, also z.B. “m” oder “W” (Groß-/Kleinschreibung möglich).

Wie bekomme ich nun anhand des Strings den Typen? Mit einer kleinen statischen Methode, die den String analysiert und den entsprechenden Typen zurückgibt. Das hatte ich zunächst einfach mittels einer Anweisung switch (typName) implementiert, aber sobald neue Typen hinzukommen, muss die entsprechende Methode ebenfalls angepasst werden, da sie nicht dynamisch auf Änderungen der Enumeration reagieren konnte (dank der fixen switch-Abfrage). Der Code-Umfang der Methode war darüber hinaus auch recht groß, da für jeden Type mindestens zwei Zeilen eingefügt werden mussten (case wert: und return typ).

Heute habe ich nun eine Lösung gefunden, wie ich mit deutlich weniger Code eine dynamische Methode zum Ermittelns eines Typs anhand eines Strings implementieren kann. Einzige Voraussetzung ist, dass der Namen des Typs dem Inhalt des Strigs entspricht.
/// <summary> /// Gibt zum übergebenen String (m, w) das entsprechende Geschlecht zurück. /// </summary> /// <param name="geschlecht">Geschlecht als String (m, w).</param> /// <returns>GeschlechtTyp zum übergebenen String.</returns> public static GeschlechtTyp GetGeschlechtTyp(string geschlecht) { geschlecht = geschlecht.ToLower(); foreach (GeschlechtTyp g in Enum.GetValues(typeof(GeschlechtTyp))) { if (geschlecht == g.ToString()) return g; } throw new IndexOutOfRangeException("Geschlecht nicht bekannt: " + geschlecht); }

Schick, oder? 😉

Über Stefan

Polyglot Clean Code Developer

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax