Créer une méthode générique contraignant T à un Enum
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)*