<p>Dans .NET Core et .NET Framework >= 4.0 <a href="https://msdn.microsoft.com/en-us/library/dd783499%28v=vs.110%29.aspx">il existe une méthode de parsing générique</a> :</p>
<pre><code class="lang-auto">Enum.TryParse("Active", out StatusEnum myStatus);
</code></pre>
<p>Cela inclut également les nouvelles variables <code>out</code> inline de C# 7, donc ceci effectue le try-parse, la conversion vers le type enum explicite et initialise + remplit la variable <code>myStatus</code>.</p>
<p>Si vous avez accès à C# 7 et au dernier .NET, c’est la meilleure façon de faire.</p>
<p>Réponse originale</p>
<p>Dans .NET, c’est plutôt inélégant (jusqu’à la version 4 ou supérieure) :</p>
<pre><code class="lang-auto">StatusEnum MyStatus = (StatusEnum) Enum.Parse(typeof(StatusEnum), "Active", true);
</code></pre>
<p>J’ai tendance à simplifier cela avec :</p>
<pre><code class="lang-auto">public static T ParseEnum<T>(string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
</code></pre>
<p>Ensuite je peux faire :</p>
<pre><code class="lang-auto">StatusEnum MyStatus = EnumUtil.ParseEnum<StatusEnum>("Active");
</code></pre>
<p>Une option suggérée dans les commentaires est d’ajouter une méthode d’extension, ce qui est assez simple :</p>
<pre><code class="lang-auto">public static T ToEnum<T>(this string value)
{
return (T) Enum.Parse(typeof(T), value, true);
}
StatusEnum MyStatus = "Active".ToEnum<StatusEnum>();
</code></pre>
<p>Enfin, vous pourriez vouloir avoir un enum par défaut à utiliser si la chaîne ne peut pas être parsée :</p>
<pre><code class="lang-auto">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;
}
</code></pre>
<p>Ce qui donne cet appel :</p>
<pre><code class="lang-auto">StatusEnum MyStatus = "Active".ToEnum(StatusEnum.None);
</code></pre>
<p>Cependant, je serais prudent en ajoutant une méthode d’extension comme celle-ci à <code>string</code> car (sans contrôle des espaces de noms) elle apparaîtra sur toutes les instances de <code>string</code>, qu’elles contiennent un enum ou non (donc <code>1234.ToString().ToEnum(StatusEnum.None)</code> 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.</p>