Auflistungen mit zusätzlichen Werten

Auflistungen mit zusätzlichen Werten

Oft kommt es vor, dass intern Auflistungen verwendet werden, die dann aber auch in der GUI angezeigt werden sollen z.B. als DropDownList.
Nun möchte man nicht unbedingt die internen Namen anzeigen sondern eine möglichst vernünftige Beschreibung verwenden ggf. sogar mit verschiedenen Übersetzungen.
Eine Möglichkeit das zu machen, wäre die einzelnen Einträge mit Attributen zu versehen, die ihr dann jederzeit auslesen könnt.

Nehmen wir also an, wir haben folgende Auflistung:
enum MapType
{
    None,
    Indoor,
    Outdoor
}

Diese Auflistung versehen wir nun mit Attribute, dazu verwende ich in meinen Beispiel einfach das bereits vorhandene Attribute DescriptionAttribute welches ihr unter System.ComponentModel finden könnt.

Also passe ich die Auflistung wie folgt an:
enum MapType
{
    [Description("Nicht festgelegt")]
    None,

    [Description("Innen")]
    Indoor,

    [Description("Außen")]
    Outdoor
}

Auslesen könnt ihr die Auflistung nun wie folgt:
Type type = typeof(MapType);
foreach (string name in Enum.GetNames(type))
{
    MemberInfo[] info = type.GetMember(name);
    Object[] descAttr = info[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

    DescriptionAttribute description = (DescriptionAttribute)descAttr[0];
}

Somit könnt ihr in eurer Oberfläche vernünftige Werte anzeigen und dabei intern mit anderen Namen arbeiten.
Selbstverständlich könnt ihr auf diese Weise beliebig viele Werte an jeden Auflistungswert verwenden z.B. um eine KeyValue-Logik zu implementieren oder übersetzungen für verschiedene Sprachen.
Um einen Kommentar zu hinterlassen, ist eine Anmeldung erforderlich.