Créer une méthode générique contraignant T à un Enum

Créer une méthode générique contraignant T à un Enum


Source : Stack Overflow

Cette fonctionnalité est enfin supportée dans C# 7.3 !

L’extrait de code suivant (tiré des exemples dotnet) montre comment faire :

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;
}

Assurez-vous de configurer la version du langage dans votre projet C# sur la version 7.3.

Réponse originale ci-dessous :

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 VB.NET, mais faites défiler vers le bas pour F#), mais c’est possible en MSIL. J’ai écrit ce petit… truc

// 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)*