Représentation en chaîne d'un Enum

Représentation en chaîne d’un Enum


Source : Stack Overflow.)

Essayez le patron type-safe-enum.

public sealed class AuthenticationMethod {

    private readonly String name;
    private readonly int value;

    public static readonly AuthenticationMethod FORMS = new AuthenticationMethod (1, "FORMS");
    public static readonly AuthenticationMethod WINDOWSAUTHENTICATION = new AuthenticationMethod (2, "WINDOWS");
    public static readonly AuthenticationMethod SINGLESIGNON = new AuthenticationMethod (3, "SSN");

    private AuthenticationMethod(int value, String name){
        this.name = name;
        this.value = value;
    }

    public override String ToString(){
        return name;
    }

}

Mise à jour
La conversion de type explicite (ou implicite) peut être effectuée en

ajoutant un champ statique avec le mapping

private static readonly Dictionary<string, AuthenticationMethod> instance = new Dictionary<string,AuthenticationMethod>();

  • n.b. Pour que l’initialisation des champs “membres de l’enum” ne lève pas une NullReferenceException lors de l’appel du constructeur d’instance, assurez-vous de placer le champ Dictionary avant les champs “membres de l’enum” dans votre classe. C’est parce que les initialiseurs de champs statiques sont appelés dans l’ordre de déclaration, et avant le constructeur statique, créant la situation étrange et nécessaire mais confuse où le constructeur d’instance peut être appelé avant que tous les champs statiques aient été initialisés, et avant que le constructeur statique soit appelé.

remplissant ce mapping dans le constructeur d’instance

instance[name] = this;

et ajoutant un opérateur de conversion de type défini par l’utilisateur

public static explicit operator AuthenticationMethod(string str)
{
    AuthenticationMethod result;
    if (instance.TryGetValue(str, out result))
        return result;
    else
        throw new InvalidCastException();
}