J'ai l'énumération suivante:
public enum AuthenticationMethod
{
FORMS = 1,
WINDOWSAUTHENTICATION = 2,
SINGLESIGNON = 3
}
Le problème, cependant, est que j'ai besoin du mot "FORMS" lorsque je demande AuthenticationMethod.FORMS et non l'identifiant 1.
J'ai trouvé la solution suivante pour ce problème (lien):
Tout d'abord, je dois créer un attribut personnalisé appelé "StringValue":
public class StringValue : System.Attribute
{
private readonly string _value;
public StringValue(string value)
{
_value = value;
}
public string Value
{
get { return _value; }
}
}
Ensuite, je peux ajouter cet attribut à mon énumération:
public enum AuthenticationMethod
{
[StringValue("FORMS")]
FORMS = 1,
[StringValue("WINDOWS")]
WINDOWSAUTHENTICATION = 2,
[StringValue("SSO")]
SINGLESIGNON = 3
}
Et bien sûr j'ai besoin de quelque chose pour récupérer cette StringValue:
public static class StringEnum
{
public static string GetStringValue(Enum value)
{
string output = null;
Type type = value.GetType();
//Vérifier d'abord dans nos résultats mis en cache...
//Rechercher notre 'StringValueAttribute'
//dans les attributs personnalisés du champ
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;
}
}
Bon maintenant j'ai les outils pour obtenir une valeur de chaîne pour une énumération. Je peux alors l'utiliser comme ceci:
string valueOfAuthenticationMethod = StringEnum.GetStringValue(AuthenticationMethod.FORMS);
D'accord maintenant tout cela fonctionne comme un charme mais je trouve que c'est beaucoup de travail. Je me demandais s'il existe une meilleure solution pour cela.
J'ai aussi essayé quelque chose avec un dictionnaire et des propriétés statiques mais ce n'était pas mieux non plus.
5 votes
Alors que vous pourriez trouver cela long, c'est en fait une façon assez flexible d'aller pour d'autres choses. Comme l'a souligné l'un de mes collègues, cela pourrait être utilisé dans de nombreux cas pour remplacer les Enum Helpers qui mapent les codes de base de données aux valeurs d'enum etc...
3 votes
Il s'agit d'une "Énumération", pas d'un "Énumérateur".
29 votes
MSDN recommande de suffixer les attributs de classe avec le suffixe "Attribute". Donc "class StringValueAttribute" ;)
14 votes
Je suis d'accord avec @BenAlabaster c'est en fait assez flexible. De plus, vous pourriez faire de ceci une méthode d'extension en ajoutant
this
devantEnum
dans votre méthode statique. Ensuite, vous pouvez faireAuthenticationMethod.Forms.GetStringValue();
5 votes
Cette approche utilise la réflexion pour lire les valeurs des attributs et c'est très lent si vous devez appeler GetStringValue() plusieurs fois à mon avis. Le modèle énuméré sûr est plus rapide.
1 votes
Si vous optez pour l'approche des attributs, plutôt que de créer le vôtre, vous pourriez utiliser
System.ComponentModel.DescriptionAttribute
.2 votes
Pourquoi vous embêtez-vous à faire tout ça alors que vous pourriez simplement appeler
.ToString()
sur l'énumération pour obtenir la chaîne "FORMS" ?