Ich habe die folgende Aufzählung:
public enum AuthenticationMethod
{
FORMS = 1,
WINDOWSAUTHENTICATION = 2,
SINGLESIGNON = 3
}
Das Problem ist jedoch, dass ich das Wort "FORMS" benötige, wenn ich nach AuthenticationMethod.FORMS frage, und nicht die ID 1.
Ich habe die folgende Lösung für dieses Problem gefunden ( Link ):
Zunächst muss ich ein benutzerdefiniertes Attribut namens "StringValue" erstellen:
public class StringValue : System.Attribute
{
private readonly string _value;
public StringValue(string value)
{
_value = value;
}
public string Value
{
get { return _value; }
}
}
Dann kann ich dieses Attribut zu meinem Enumerator hinzufügen:
public enum AuthenticationMethod
{
[StringValue("FORMS")]
FORMS = 1,
[StringValue("WINDOWS")]
WINDOWSAUTHENTICATION = 2,
[StringValue("SSO")]
SINGLESIGNON = 3
}
Und natürlich brauche ich etwas, um diesen StringValue abzurufen:
public static class StringEnum
{
public static string GetStringValue(Enum value)
{
string output = null;
Type type = value.GetType();
//Check first in our cached results...
//Look for our 'StringValueAttribute'
//in the field's custom attributes
FieldInfo fi = type.GetField(value.ToString());
StringValue[] attrs =
fi.GetCustomAttributes(typeof(StringValue),
false) as StringValue[];
if (attrs.Length > 0)
{
output = attrs[0].Value;
}
return output;
}
}
Gut, jetzt habe ich die Werkzeuge, um einen String-Wert für einen Enumerator zu erhalten. Ich kann ihn dann wie folgt verwenden:
string valueOfAuthenticationMethod = StringEnum.GetStringValue(AuthenticationMethod.FORMS);
Okay, das funktioniert alles prima, aber ich finde es eine Menge Arbeit. Ich habe mich gefragt, ob es eine bessere Lösung für dieses Problem gibt.
Ich habe auch etwas mit einem Wörterbuch und statischen Eigenschaften versucht, aber auch das war nicht besser.
5 Stimmen
Auch wenn Sie das vielleicht langatmig finden, so ist es doch ein ziemlich flexibler Weg, um andere Dinge zu erledigen. Wie einer meiner Kollegen bemerkte, könnte dies in vielen Fällen verwendet werden, um Enum Helpers zu ersetzen, die Datenbankcodes auf Enum-Werte usw. abbilden.
3 Stimmen
Es handelt sich um eine "Aufzählung", nicht um einen "Enumerator".
29 Stimmen
MSDN empfiehlt, Attributklassen mit dem Suffix "Attribute" zu versehen. Also "Klasse StringValueAttribute" ;)
14 Stimmen
Ich stimme mit @BenAlabaster überein, dass dies eigentlich recht flexibel ist. Sie könnten dies auch zu einer Erweiterungsmethode machen, indem Sie einfach Folgendes hinzufügen
this
vor demEnum
in Ihrer statischen Methode. Dann können SieAuthenticationMethod.Forms.GetStringValue();
5 Stimmen
Dieser Ansatz verwendet Reflection, um die Attributwerte zu lesen, und ist meiner Erfahrung nach sehr langsam, wenn Sie GetStringValue() viele Male aufrufen müssen. Das typsichere Enum-Muster ist schneller.
1 Stimmen
Wenn Sie den Weg über die Attribute gehen, anstatt Ihre eigenen zu erstellen, könnten Sie Folgendes verwenden
System.ComponentModel.DescriptionAttribute
.2 Stimmen
Warum machen Sie sich all diese Mühe, wenn Sie einfach anrufen können?
.ToString()
auf die Aufzählung, um die Zeichenfolge "FORMS" zu erhalten?