Sie können den Elementen in der Aufzählung Attribute hinzufügen und dann die Reflexion verwenden, um die Werte aus den Attributen zu erhalten.
Sie müssen den "Feld"-Spezifizierer verwenden, um die Attribute anzuwenden, etwa so:
enum GroupTypes
{
[field:Description("OEM")]
TheGroup,
[field:Description("CMB")]
TheOtherGroup
}
Sie würden dann über die statischen Felder des Typs der Aufzählung (in diesem Fall GroupTypes) reflektieren und die DescriptionAttribute
für den Wert, den Sie mit Hilfe von Reflexion gesucht haben:
public static DescriptionAttribute GetEnumDescriptionAttribute<T>(
this T value) where T : struct
{
// The type of the enum, it will be reused.
Type type = typeof(T);
// If T is not an enum, get out.
if (!type.IsEnum)
throw new InvalidOperationException(
"The type parameter T must be an enum type.");
// If the value isn't defined throw an exception.
if (!Enum.IsDefined(type, value))
throw new InvalidEnumArgumentException(
"value", Convert.ToInt32(value), type);
// Get the static field for the value.
FieldInfo fi = type.GetField(value.ToString(),
BindingFlags.Static | BindingFlags.Public);
// Get the description attribute, if there is one.
return fi.GetCustomAttributes(typeof(DescriptionAttribute), true).
Cast<DescriptionAttribute>().SingleOrDefault();
}
Ich habe mich für die Rückgabe der DescriptionAttribute
selbst, falls Sie feststellen wollen, ob das Attribut überhaupt angewendet wird oder nicht.
1 Stimmen
Mögliche Duplikate von Enum ToString
24 Stimmen
Ich bin mir nicht sicher, warum die meisten Antworten nicht einfach "const string" verwenden und stattdessen eigene Klassen erstellen.
2 Stimmen
Sie können zwar keine Zeichenketten verwenden, aber Sie können sehr wohl Zeichenketten verwenden. Das ist eine Option, wenn Sie Werte mit nur einem Buchstaben verwenden können.
2 Stimmen
Ich bin wirklich verwirrt, warum die oben von CTS_AE vorgeschlagene Lösung nicht einmal unter den ersten drei Antworten ist.
0 Stimmen
@Sinjai Die explizite Gruppierung zusammengehöriger Werte wiegt den Nachteil eines unmerklichen Leistungsverlusts auf, insbesondere bei einer API oder einer wiederverwendbaren Komponente.
0 Stimmen
Ich bin verwirrt. Während das Erstellen einer benutzerdefinierten Klasse, wie in der vorgeschlagenen Antwort vorgeschlagen, funktioniert, bin ich der Meinung, dass eine
const string
scheint der eigentliche Kandidat für dieses Problem zu sein. Ich würde es einfach halten.6 Stimmen
@Sau001 / CTS_AE - wollte dies hier anbringen, da diese Kommentare ganz oben stehen und man ein wenig scrollen muss, um die Antwort zu finden. Siehe den Kommentar von Pharap zu dieser Antwort: stackoverflow.com/a/5674697/5948647 . Statische Klassen können nicht als Methodenparametertypen verwendet werden, so dass Sie die Verwendung einer Ihrer vordefinierten konstanten Zeichenketten in Methoden nicht erzwingen können.