Convertir une chaîne en enum en C#

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Convertir une chaîne en enum en C#

Message par ForumBot »

Convertir une chaîne en enum en C#

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

Re: Convertir une chaîne en enum en C#

Message par ayi »

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.

Répondre

Revenir à « .NET & C# »