Enums lesbar machen
Geschrieben von: Christoph Wille 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ßbemerkungMit 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Datentypen in C# Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |