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 ?

4voto

jan Points 938

Pouvez-vous abus GetHashCode pour cela ?

public enum MyEnum
{
  Foo = 100,
  Bar = 200,
  Fizz = 0
}

static void Main(string[] args)
{
  var i1 = MyEnum.Foo.GetHashCode();  // i1 = 100
  var i2 = MyEnum.Bar.GetHashCode();  // i2 = 200
  var i3 = MyEnum.Fizz.GetHashCode(); // i3 = 0
}

Veuillez noter : " GetHashCode() est par conception ne sert qu'à une seule chose : mettre un objet dans une table de hachage. D'où le nom". - E. Lippert

4voto

Voici une méthode plus simple.

Puisque Enum implémente IConvertible, nous pouvons utiliser ToInt32(..).

int? value = (enumCandidate as IConvertible)?.ToInt32(CultureInfo.InvariantCulture.Numberformat);

Ou si vous souhaitez une méthode générale pour les enums génériques :

public static int GetEnumValue<T>(T inputEnum) where T: struct, IConvertible
{
    Type t = typeof(T);
    if (!t.IsEnum)
    {
        throw new ArgumentException("Input type must be an enum.");
    }

    return inputEnum.ToInt32(CultureInfo.InvariantCulture.NumberFormat);

}

Ou plus généralement encore :

public static int GetEnumValue(object enumInput)
{
    Type t = enumInput.GetType();
    if (!t.IsEnum)
    {
        throw new ArgumentException("Input type must be an enum.");
    }

    return ((IConvertible)inputEnum).ToInt32(CultureInfo.InvariantCulture.NumberFormat);

}

3voto

Adam B Points 1110

Si vous restreignez le générique T à un Enum en utilisant

where T: Enum

vous pouvez alors utiliser la phrase suivante

public static int GetIndexFromEnum<T>(T enumValue) where T : Enum {
    int index = Convert.ToInt32(enumValue);
    return index;
}

Cela semble être la solution la plus simple, tant que vous pouvez garantir que T sera une Enum.

3voto

manCuongCs Points 11

Il suffit d'abord de transformer le T générique en objet

T value;
int int_value = (int)(object)value;

C'est tout.

1voto

zmbq Points 18714

Je suis surpris que votre code fonctionne. Enum.GetValues renvoie un tableau d'entiers, qui sont les valeurs recherchées. Et, comme d'autres l'ont mentionné, vous ne pouvez pas contraindre vos génériques à un enum .

Au lieu de cela, vous devriez probablement appeler votre Description comme une méthode statique normale et non comme une méthode d'extension.

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