Représentation sous forme de chaîne d'un Enum

J'ai l'énumération suivante:

public enum AuthenticationMethod
{
    FORMS = 1,
    WINDOWSAUTHENTICATION = 2,
    SINGLESIGNON = 3
}

Le problème, toutefois, est que j'ai besoin du mot "FORMES" quand je demande pour AuthenticationMethod.FORMES et pas l'id 1.

J'ai trouvé la solution suivante pour résoudre ce problème (lien):

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; }
    }

}

Alors je peux ajouter cet attribut à mon agent recenseur:

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 StringValue:

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;
    }
}

Bon maintenant que j'ai les outils pour obtenir une valeur de chaîne pour un agent recenseur.
Je peux alors l'utiliser comme ceci:

string valueOfAuthenticationMethod = StringEnum.GetStringValue(AuthenticationMethod.FORMS);

Bon, maintenant, tous ces travaux comme un charme, mais je trouve qu'il a beaucoup de travail. Je me demandais si il ya une meilleure solution.

J'ai aussi essayé quelque chose avec un dictionnaire et des propriétés statiques mais ce n'était pas mieux non plus.

  • Nice! Je peux l'utiliser pour traduire les valeurs de l'enum de chaînes localisées.
  • Tandis que vous pouvez trouver cette longue haleine, c'est en fait une assez souple de chemin à faire pour d'autres choses. Comme un de mes collègues l'ont souligné, cela pourrait être utilisé dans de nombreux cas, de remplacer Enum Aides que la carte de base de données les codes pour les valeurs de l'enum etc...
  • C'est une "Énumération", pas un "agent Recenseur".
  • MSDN reccoments suffixe classes d'attributs avec "Attribut" suffixe. Donc "classe StringValueAttribute" 😉
  • Je suis d'accord avec @BenAlabaster c'est tout à fait flexible. Aussi, vous pouvez faire ce une méthode d'extension en ajoutant simplement des this en face de la Enum dans votre méthode statique. Ensuite, vous pouvez faire AuthenticationMethod.Forms.GetStringValue();
  • Cette approche utilise la réflexion pour lire les valeurs d'attribut et il est très lent si vous devez appeler GetStringValue() plusieurs fois dans mon expérience. Le type-safe-enum modèle est plus rapide.
  • Si vous allez vers le bas de l'attribut de la route, plutôt que de rouler votre propre, vous pouvez utiliser System.ComponentModel.DescriptionAttribute.
  • Pourquoi allez-vous à travers tous les ennuis lorsque vous pouvez simplement appeler .ToString() sur l'enum pour obtenir la chaîne de caractères "FORMES"?

InformationsquelleAutor user29964 | 2009-01-08