<p>Cette fonctionnalité est enfin supportée dans C# 7.3 !</p>
<p>L’extrait de code suivant (tiré des <a href="https://github.com/dotnet/samples/blob/3ee82879284e3f4755251fd33c3b3e533f7b3485/snippets/csharp/keywords/GenericWhereConstraints.cs#L180-L190">exemples dotnet</a>) montre comment faire :</p>
<pre><code class="lang-auto">public static Dictionary<int, string> EnumNamedValues<T>() where T : System.Enum
{
var result = new Dictionary<int, string>();
var values = Enum.GetValues(typeof(T));
foreach (int item in values)
result.Add(item, Enum.GetName(typeof(T), item));
return result;
}
</code></pre>
<p>Assurez-vous de configurer la version du langage dans votre projet C# sur la version 7.3.</p>
<p>Réponse originale ci-dessous :</p>
<p>Je suis arrivé tard dans la partie, mais j’ai pris cela comme un défi pour voir comment cela pouvait être fait. Ce n’est pas possible en C# (ni en <a href="http://VB.NET">VB.NET</a>, mais faites défiler vers le bas pour F#), mais <em>c’est possible</em> en MSIL. J’ai écrit ce petit… truc</p>
<pre><code class="lang-auto">// license: http://www.apache.org/licenses/LICENSE-2.0.html
.assembly MyThing{}
.class public abstract sealed MyThing.Thing
extends [mscorlib]System.Object
{
.method public static !!T GetEnumFromString<valuetype .ctor ([mscorlib]System.Enum) T>(string strValue,
!!T defaultValue) cil managed
{
.maxstack 2
.locals init ([0] !!T temp,
[1] !!T return_value,
[2] class [mscorlib]System.Collections.IEnumerator enumerator,
[3] class [mscorlib]System.IDisposable disposer)
// if(string.IsNullOrEmpty(strValue)) return defaultValue;
ldarg strValue
call bool [mscorlib]System.String::IsNullOrEmpty(string)
brfalse.s HASVALUE
br RETURNDEF // return default it empty
// foreach (T item in Enum.GetValues(typeof(T)))
HASVALUE:
// Enum.GetValues.GetEnumerator()
ldtoken !!T
call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
call class [mscorlib]System.Array [mscorl
(Réponse tronquée)</code></pre>