Dans .NET Core et .NET> 4, il existe une méthode d'analyse générique :
Enum.TryParse("Active", out StatusEnum myStatus);
Cela inclut également les nouvelles out
variables en ligne de C # 7 , donc cela fait le try-parse, la conversion au type d'énumération explicite et initialise + remplit la myStatus
variable.
Si vous avez accès à C # 7 et au dernier .NET, c'est la meilleure façon.
Réponse originale
Dans .NET, c'est plutôt moche (jusqu'à 4 ou plus):
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 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 voudrez peut-être avoir une énumération par défaut à utiliser si la chaîne ne peut pas être analysé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 en fait l'appel:
StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
Cependant, je serais prudent d'ajouter une méthode d'extension comme celle-ci string
car (sans contrôle d'espace de noms), elle apparaîtra sur toutes les instances, string
qu'elles contiennent ou non une énumération (ce 1234.ToString().ToEnum(StatusEnum.None)
serait donc 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, à moins que toute votre équipe de développement ne comprenne très bien ce que font ces extensions.