85 votes

Comment convertir un enum générique en int ?

J'ai une petite méthode qui ressemble à ceci :

public void SetOptions<T>() where T : Enum
{
    int i = 0;
    foreach (T obj in Enum.GetValues(typeof(T)))
    {
        if (i == 0)
            DefaultOption = new ListItem(obj.Description(), obj.ToString());
        i++;
        DropDownList.Items.Add(new ListItem(obj.Description(), obj.ToString()));
    }
}

En fait, j'alimente une liste déroulante à partir d'une énumération. Description() est en fait une méthode d'extension pour les enums, donc T est définitivement un enum .

Cependant, je veux lancer obj comme vous le feriez pour n'importe quel enum à son index, comme ceci (int)obj mais je reçois une erreur disant que je ne peux pas convertir T en int. Existe-t-il un moyen de le faire ?

1voto

matk Points 891

L'utilisation de LINQ permet de réaliser cette opération de manière élégante :

public static void SetOptions<T>(this DropDownList dropDownList)
{
    if (!typeof(T).IsEnum)
    {
        throw new ArgumentException("Type must be an enum type.");
    }

    dropDownList.Items.AddRange(Enum
        .GetValues(typeof(T))
        .Cast<Enum>()
        .Select(x => new ListItem(x.ToString(), Convert.ToInt32(x).ToString()))
        .ToArray());
}

0voto

ejmarino Points 71

Essayez ceci : (en supposant que le TEnum a une numération de 0 à n)

public void SetOptions<TEnum>() where TEnum : Enum
{
    foreach (TEnum obj in Enum.GetValues(typeof(TEnum)))
    {
        var i = (int)(object)obj;
        if (i == 0) DefaultOption = new ListItem(obj.Description(), obj.ToString());
        DropDownList.Items.Add(new ListItem(obj.Description(), obj.ToString()));
    }
}

-3voto

P. Avery Points 641

Pour compléter la réponse de Jan concernant les génériques et les valeurs d'énumération :

void MyFunc<T>(T value)
{
    Type t = typeof(T);
    if(t.IsEnum)
    {
        int valueAsInt = value.GetHashCode(); // returns the integer value
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X