Warum ist die Frage "How can I enumerate an enum?" so beliebt?
\n\nWenn Sie jemals in C# programmiert und mit Aufzählungen (enum) gearbeitet haben, haben Sie sich sicherlich gefragt: "Wie erhalte ich alle Werte dieses enum?". Diese Frage ist ein echter Hit auf Stack Overflow mit tausenden von Aufrufen. Und das ist nicht verwunderlich: Das Auflisten eines enum ist eine dieser Aufgaben, die einfach erscheint, aber ohne Kenntnis der richtigen Syntax selbst erfahrene Entwickler in die Irre führen kann.
In diesem Artikel werden wir uns ansehen, wie man alle Werte eines enum in C# korrekt auflistet, zeigen funktionierende Codebeispiele, die Sie direkt in Ihr Projekt kopieren können, und auf mögliche Fallstricke hinweisen. Los geht's!
\n\nWas ist ein enum in C#? Eine kurze Erinnerung
\n\nEnum (Aufzählung) ist ein Datentyp, der es ermöglicht, einen Satz benannter Konstanten zu definieren. Zum Beispiel Wochentage, Bestellstatus oder Fehlertypen. In C# wird ein enum wie folgt deklariert:
\n\npublic enum DayOfWeek\n{\n Monday,\n Tuesday,\n Wednesday,\n Thursday,\n Friday,\n Saturday,\n Sunday\n}\n\nJedem Element wird standardmäßig ein ganzzahliger Wert zugewiesen (beginnend mit 0). Aber oft besteht die Notwendigkeit, alle Elemente eines enum zu durchlaufen – zum Beispiel, um sie in einer Dropdown-Liste anzuzeigen, ein Array zu erstellen oder zu prüfen, ob ein Wert existiert.
\n\nWie man alle Enum-Werte auflistet: Die grundlegende Methode
\n\nDie beliebteste und einfachste Methode ist die Verwendung der statischen Methode Enum.GetValues(). Sie gibt ein Array aller Werte der angegebenen Aufzählung zurück. So funktioniert es:
using System;\n\npublic class Program\n{\n public enum Status\n {\n New,\n InProgress,\n Completed,\n Cancelled\n }\n\n public static void Main()\n {\n // Alle enum-Werte abrufen\n Status[] allStatuses = (Status[])Enum.GetValues(typeof(Status));\n\n // Mit foreach durchlaufen\n foreach (Status status in allStatuses)\n {\n Console.WriteLine(status);\n }\n }\n}\n\nErgebnis der Ausführung:
\nNew\nInProgress\nCompleted\nCancelled\n\nBeachten Sie: Wir wandeln das Ergebnis explizit in ein Array vom Typ Status[] um, da Enum.GetValues() ein Array (nicht typisiert) zurückgibt.
Alternative: Enum.GetNames()
\n\nWenn Sie nicht die Werte selbst, sondern nur deren Zeichenfolgennamen benötigen, verwenden Sie Enum.GetNames():
string[] statusNames = Enum.GetNames(typeof(Status));\nforeach (string name in statusNames)\n{\n Console.WriteLine(name);\n}\n\nDas Ergebnis ist dasselbe, aber der Elementtyp ist string und nicht Status. Dies ist praktisch, wenn Sie mit der Benutzeroberfläche oder Serialisierung arbeiten.
Moderner Ansatz: Generische Version (C# 7.3+)
\n\nAb C# 7.3 gibt es eine elegantere Methode – Enum.GetValues<T>(). Sie gibt ein Array des spezifischen Typs zurück, und eine Typumwandlung ist nicht erforderlich:
Status[] allStatuses = Enum.GetValues<Status>();\n\nforeach (Status status in allStatuses)\n{\n Console.WriteLine($"ID: {(int)status}, Name: {status}");\n}\n\nDiese Methode ist kürzer und typsicherer. Wenn Sie eine moderne Version von C# verwenden (was Sie sollten!), empfehle ich diese.
\n\nBeispiel aus der Praxis: Befüllen einer Dropdown-Liste
\n\nStellen Sie sich vor, Sie schreiben eine Anwendung zur Aufgabenverwaltung. Sie möchten dem Benutzer eine Liste möglicher Status in einem Dropdown-Menü anzeigen. So geht das mit Enum-Aufzählung:
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class TaskManager\n{\n public enum TaskStatus\n {\n NotStarted,\n InProgress,\n WaitingForReview,\n Done\n }\n\n publ