Convertir une chaîne en enum en C#

Convertir une chaîne en enum en C#


Source : Stack Overflow

Dans .NET Core et .NET Framework >= 4.0 il existe une méthode de parsing générique :

Enum.TryParse("Active", out StatusEnum myStatus);

Cela inclut également les nouvelles variables out inline de C# 7, donc ceci effectue le try-parse, la conversion vers le type enum explicite et initialise + remplit la variable myStatus.

Si vous avez accès à C# 7 et au dernier .NET, c’est la meilleure façon de faire.

Réponse originale

Dans .NET, c’est plutôt inélégant (jusqu’à la version 4 ou supérieure) :

StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);

J’ai tendance à simplifier cela avec :

public static T ParseEnum<T>(string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

Ensuite je peux faire :

StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");

Une option suggérée dans les commentaires est d’ajouter une méthode d’extension, ce qui est assez simple :

public static T ToEnum<T>(this string value)
{
    return (T) Enum.Parse(typeof(T), value, true);
}

StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();

Enfin, vous pourriez vouloir avoir un enum par défaut à utiliser si la chaîne ne peut pas être parsée :

public static T ToEnum<T>(this string value, T defaultValue)
{
    if (string.IsNullOrEmpty(value))
    {
        return defaultValue;
    }

    T result;
    return Enum.TryParse<T>(value, true, out result) ? result : defaultValue;
}

Ce qui donne cet appel :

StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);

Cependant, je serais prudent en ajoutant une méthode d’extension comme celle-ci à string car (sans contrôle des espaces de noms) elle apparaîtra sur toutes les instances de string, qu’elles contiennent un enum ou non (donc 1234.ToString().ToEnum(StatusEnum.None) serait valide mais absurde). Il est souvent préférable d’éviter d’encombrer les classes principales de Microsoft avec des méthodes supplémentaires qui ne s’appliquent que dans des contextes très spécifiques, sauf si toute votre équipe de développement a une très bonne compréhension de ce que font ces extensions.