Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Enums lesbar machen

Geschrieben von: Christoph Wille
Kategorie: C#

This printed page brought to you by AlphaSierraPapa

Der heutige Artikel widmet sich einem Thema aus C#, das gerade bei der Entwicklung größerer Projekte interessant werden könnte - dem Konvertieren von Enum Werten in "lesbare" Strings.

Da das Ganze jetzt sehr abstrakt klingt, hier ein Beispiel einer Enum:

<script language="C#" runat=server>
enum Wochentag 
{ 
  Montag=1,   // Attributname = Attributwert
  Dienstag, 
  Mittwoch, 
  Donnerstag, 
  Freitag, 
  Samstag, 
  Sonntag 
};
</script>

Instanziert man eine Variable vom Typ Wochentag, so kann man nur Werte von 1 bis 7 zuweisen, oder die Attributnamen (sozusagen symbolische Konstanten):

Wochentag myDayTest1 = 1; // Montag
Wochentag myDayTest2 = Wochentag.Donnerstag; // Wert: 4

Mit solcherart typisierten Variablen verhindert man eine Menge von Fehlern. Allerdings stellt sich die Frage - jetzt habe ich eine tolle Enum, aber was, wenn ich die Attributnamen in einer DropDown Liste darstellen will, damit der Benutzer den Tag auswählen kann?

In solchen Fällen wurde dann meist auf zusätzliche Arrays ausgewichen, die die Attributnamen als Strings enthielten. Hier ein kleines VBScript Beispiel:

arrValues = Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", ...)
For n=0 To UBound(arrValues)
  ...
Next

Klarerweise wird damit die Gefahr eingeführt, daß Attributnamen und das zusätzliche Array irgendwann nach Änderungen unterschiedliche Werte enthalten. Das ist nicht so wünschenswert. Nicht davon zu reden, wenn sich die Attributwerte ändern - dann wird es vollends haarig.

In C# kann man diese Klippe sehr elegant umschiffen (eigentlich .NET, aber wir wollen heute nicht kleinlich sein) - Enum's können die Werte formatiert ausgeben. Nachfolgend das Beispiel enum.aspx, das Teil des heutigen Downloads ist.

<%@ Page Language="C#" %>
<script language="C#" runat=server>
enum Wochentag 
{ 
  Montag=1, 
  Dienstag, 
  Mittwoch, 
  Donnerstag, 
  Freitag, 
  Samstag, 
  Sonntag 
};
</script>
<%
 // einfache Variable des Enum-Typs erzeugen
 Wochentag myDay;
 
 // erzeugen eines Arrays von Wochentag-Enum-Werten, sortiert nach Wert
 Array enValues = Enum.GetValues(typeof(Wochentag));
 
 for (int n=0; n < enValues.GetLength(0); n++)
 {
   myDay = (Wochentag)enValues.GetValue(n);
   Response.Write("Name=" + Enum.GetName(typeof(Wochentag), myDay));
   Response.Write(",  Wert=" + Enum.Format(typeof(Wochentag), myDay,"D") + "<br>");
 }
%>

Alles klar? <g/> Wer ASP.NET schon ein bischen kennt, fragt sich vielleicht, warum die Enum in einem separaten SCRIPT Block definiert ist - der Grund: es ist ein eigener (neuer) Typ, und da alles in <%%> in die Render Methode eingebaut wird, geht das nicht anders.

Der eigentliche Trick des Codes besteht darin, daß man über Enum.GetValues ein Array von Werten der Enum erhält (in unserem Fall also 7 Elemente). Über dieses Array läuft man dann mit einer for Schleife. Damit man den Attributnamen erhält, verwendet man die GetName Methode - diese ist genauso wie die Format() Methode eine statische Methode der System.Enum Klasse. Letztere Methode formatiert uns den Wert eines Enum-Typs als dezimale Zahl - und schon hat man eine Liste Name=Wert.

Der in enum.aspx gezeigt Code kann auf beliebige Elemente des Typs Wochentag angewendet werden. Will man alle Elemente des Enums in einer Schleife möglichst effizient ausgeben, eignet sich folgender Code dafür besser (enum_iterateonly.aspx):

<%@ Page Language="C#" %>
<script language="C#" runat=server>
 ... // gleich zu enum.aspx
</script>
<%
 // einfache Variable des Enum-Typs erzeugen
 Wochentag myDay;
 
 // beide Arrays werden nach Value sortiert geliefert, also synchron
 Array enValues = Enum.GetValues(typeof(Wochentag));
 string[] enNames = Enum.GetNames(typeof(Wochentag));
 
 for (int n=0; n < enValues.GetLength(0); n++)
 {
   Response.Write("Name=" + enNames[n]);
   myDay = (Wochentag)enValues.GetValue(n);
   Response.Write(",  Wert=" + Enum.Format(typeof(Wochentag), myDay,"D") + "<br>");
 }
%>

Der Unterschied ist, daß die Konstantennamen ebenfalls in ein Array ausgelesen werden - und zwar mit Hilfe der GetNames Methode. Und schon hat man eine effizientere Schleife als zuvor.

Schlußbemerkung

Mit diesem allgemein gehaltenen Code kann man nun DropDown Listen, oder welche Auswahlen auch immer befüllen gehen - Attributnamen und Attributwerte werden immer korrekt im Einklang miteinander stehen.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010215.zip

Verwandte Artikel

Datentypen in C#
http:/www.aspheute.com/artikel/20000726.htm
Deutsche Personalausweisnummern verifizieren
http:/www.aspheute.com/artikel/20020507.htm
Schleifenbefehle in C#
http:/www.aspheute.com/artikel/20000717.htm
Unions in C#
http:/www.aspheute.com/artikel/20020207.htm
Wochenberechnung mit .NET
http:/www.aspheute.com/artikel/20020905.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.