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? 😉