Meine Aufzählung besteht aus folgenden Werten:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Ich möchte diese Werte jedoch benutzerfreundlich ausgeben können.
Ich muss nicht wieder von String zu Wert wechseln können.
Antworten:
Ich verwende das
Description
Attribut aus dem System.ComponentModel-Namespace. Dekorieren Sie einfach die Aufzählung:Verwenden Sie dann diesen Code, um ihn abzurufen:
quelle
ArgumentException
Ich mache das mit Erweiterungsmethoden:
quelle
default
Fall Implementierung zurückzukehrenme.ToString()
Schaltergehäuse - Anweisungen für die ENUM - Werte und nur zur Verfügung stellen , dass Sie außer Kraft setzen möchten. In Ihrem Beispiel habe ich festgestellt, dass sie alle unterschiedlich sind, aber in tatsächlichen Anwendungsfällen vermute ich, dass die meisten Einzelwort-Aufzählungswerte ausreichen und Sie nur Überschreibungen für Mehrwort-Aufzählungswerte bereitstellen.Vielleicht fehlt mir etwas, aber was ist mit Enum.GetName los?
Bearbeiten: Für benutzerfreundliche Zeichenfolgen müssen Sie eine .ressource durchlaufen, um die Internationalisierung / Lokalisierung durchzuführen. Es ist wahrscheinlich besser, einen festen Schlüssel zu verwenden, der auf dem Enum-Schlüssel basiert, als ein Dekorator-Attribut.
quelle
Ich habe eine umgekehrte Erweiterungsmethode erstellt, um die Beschreibung wieder in einen Aufzählungswert umzuwandeln:
quelle
Die einfachste Lösung besteht darin, eine benutzerdefinierte Erweiterungsmethode zu verwenden (zumindest in .NET 3.5 - Sie können sie einfach in eine statische Hilfsmethode für frühere Framework-Versionen konvertieren).
Ich gehe hier davon aus, dass Sie etwas anderes als den tatsächlichen Namen des Aufzählungswerts zurückgeben möchten (den Sie durch einfaches Aufrufen von ToString erhalten können).
quelle
Dieser andere Beitrag ist Java. Sie können keine Methoden in Enums in C # einfügen.
mach einfach so etwas:
Wenn Sie unterschiedliche Anzeigewerte für Ihre Aufzählungswerte verwenden möchten, können Sie Attribute und Reflexion verwenden.
quelle
Am einfachsten ist es, diese Erweiterungsklasse in Ihr Projekt aufzunehmen. Sie funktioniert mit jeder Aufzählung im Projekt:
Verwendungszweck:
...
quelle
string result = "Result: " + ee;
Einige andere primitivere Optionen, die Klassen / Referenztypen vermeiden:
Array-Methode
Verwendung
Verschachtelte Strukturmethode
Verwendung
Update (03/09/2018)
Eine Mischung aus Erweiterungsmethoden und der ersten Technik oben.
Ich bevorzuge es, Enums dort zu definieren, wo sie "hingehören" (am nächsten an ihrer Herkunftsquelle und nicht in einem gemeinsamen globalen Namespace).
Die Erweiterungsmethode scheint für einen gemeinsamen Bereich geeignet zu sein, und die "lokalisierte" Definition der Aufzählung macht die Erweiterungsmethode jetzt ausführlicher.
Ein Anwendungsbeispiel für die Aufzählung und ihre Erweiterungsmethode.
Hinweis: Ich habe mich tatsächlich dazu entschlossen, den
Enum
Wrapper (und dasName
Array) zu entfernen, da es am besten ist, dass die Namenszeichenfolgen aus einer Ressource (z. B. Konfigurationsdatei oder Datenbank) stammen, anstatt fest codiert zu sein, und weil ich die Erweiterungsmethode in das Feld eingefügt habeViewModels
Namespace (nur in einer anderen "CommonVM.cs" -Datei). Außerdem wird das Ganze.Id
ablenkend und umständlich.CommonVM.cs
Ein Anwendungsbeispiel für die Aufzählung und ihre Erweiterungsmethode.
quelle
Sie können das Humanizer- Paket mit der Möglichkeit Humanize Enums verwenden. Ein Beispiel:
Dann können Sie die
Humanize
Erweiterungsmethode für enum direkt verwenden:quelle
In Bezug auf Ray Booysen gibt es einen Fehler im Code: Enum ToString mit benutzerfreundlichen Zeichenfolgen
Sie müssen mehrere Attribute für die Aufzählungswerte berücksichtigen.
quelle
quelle
this
Parameter in Erweiterungsmethoden, derThis
in vielen Beispielen im Web aufgerufen wird . Wenn Sie es wie Ihren Typ aufrufen (Enum Enum
), ist der Code weniger lesbar.Verwenden Sie anstelle einer Aufzählung eine statische Klasse.
ersetzen
mit
es wird so verwendet
Problem mit den besten "Erweiterungsmethoden" -Lösungen:
Eine private Aufzählung wird häufig in einer anderen Klasse verwendet. Die Erweiterungsmethodenlösung ist dort nicht gültig, da sie in einer eigenen Klasse sein muss. Diese Lösung kann privat und in eine andere Klasse eingebettet sein.
quelle
Ich bin zufällig ein VB.NET-Fan. Hier ist meine Version, in der die DescriptionAttribute-Methode mit einer Erweiterungsmethode kombiniert wird. Zunächst die Ergebnisse:
Grundlegendes: eine Aufzählung namens EnumType mit drei Werten V1, V2 und V3. Die "Magie" geschieht im Console.WriteLine-Aufruf in Sub Main (), wo das letzte Argument einfach ist
v.Description
. Dies gibt "Eins" für V1, "V2" für V2 und "Drei" für V3 zurück. Diese Beschreibungsmethode ist tatsächlich eine Erweiterungsmethode, die in einem anderen Modul namens EnumExtensions definiert ist:Da das Nachschlagen von Beschreibungsattributen mit
Reflection
langsam ist, werden die Suchvorgänge auch privat zwischengespeichertDictionary
, der bei Bedarf ausgefüllt wird.(Entschuldigung für die VB.NET-Lösung - die Übersetzung in C # sollte relativ einfach sein, und mein C # ist bei neuen Themen wie Erweiterungen verrostet.)
quelle
Saubere Zusammenfassung der obigen Vorschläge mit Beispiel:
VERWENDUNG:
quelle
Verwenden Sie Enum.GetName
Über den obigen Link ...
quelle
Gemäß dieser Dokumentation: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
Es ist möglich, einen Enumerator einfach in ein Format wie das folgende zu konvertieren:
Sie können alle möglichen Formate unter diesem Link sehen: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
quelle
Dies ist ein Update von Ray Booysens Code, der die generische GetCustomAttributes-Methode und LINQ verwendet, um die Dinge etwas aufgeräumter zu machen.
quelle
Noch sauberere Zusammenfassung:
Gleiche Verwendung wie der Unterstrich beschreibt.
quelle
Für Flaggen Aufzählung einschließlich.
quelle
Wenn Sie nur ein Leerzeichen zwischen den Wörtern einfügen möchten, ist dies so einfach wie
quelle
Ich verwende eine generische Klasse zum Speichern der Enum / Description-Paare und eine verschachtelte Hilfsklasse zum Abrufen der Beschreibung.
Die Aufzählung :
Die generische Klasse:
Hinweis: Da eine generische Klasse nicht durch eine Aufzählung eingeschränkt werden kann, beschränke ich sie stattdessen auf struct und suche im Konstruktor nach Aufzählung .
Verwendungszweck:
quelle
Ich denke, der beste (und einfachste) Weg, Ihr Problem zu lösen, besteht darin, eine Erweiterungsmethode für Ihre Aufzählung zu schreiben:
quelle
Wenn Sie etwas vollständig anpassbares möchten, probieren Sie meine Lösung hier aus:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
Grundsätzlich beschreibt der Beitrag, wie Sie Beschreibungsattribute an jede Ihrer Aufzählungen anhängen, und bietet eine allgemeine Möglichkeit, die Zuordnung von Aufzählung zu Beschreibung zuzuordnen.
quelle