2017-10-05 1 views
0

J'utilise ASP.NET et d'obtenir un petit problème avec Enum:Coulée à Int32 est nécessaire lors de l'utilisation de la méthode GetName enum

public enum Lang : byte 
{ 
    en = 0, 
    fr = 1 
} 

Lang value = Lang.en; 

string name = Enum.GetName(typeof(Lang), value); // "en" 

cela fonctionne. depuis je l'ai changé à:

@foreach (SelectListItem lang in Html.GetEnumSelectList<Lang>()) 
{ 
    string name = Enum.GetName(typeof(Lang), lang.Value); 
} 

j'avais reçu ce message d'erreur:

ArgumentException: La valeur transmise doit être une base enum ou un type sous-jacent pour un ENUM, comme un Int32 . Nom du paramètre: Valeur

, j'avais essayé:

string name = Enum.GetName(typeof(Lang), Convert.ToInt32(lang.Value)); 

il a travaillé.

pourquoi est-ce?

Lang.en est byte, pourquoi a-t-il besoin d'un Int32?

Répondre

1

Si nous regardons la documentation Enum.GetName, nous pouvons lire:

ArgumentException:
* enumType est pas un Enum
OU
* value est ni de type enumType pas plus qu'il ne ont le même type sous-jacent que enumType

Le problème est que dans votre deuxième approche que vous utilisez Convert.ToInt32(lang.Value), obtenant ainsi un Int32 au lieu d'un byte comme ENUM Requires:

public enum Lang : byte 

Ainsi, la solution simple est de passer dans un byte au lieu d'un int:

string name = Enum.GetName(typeof(Lang), Convert.ToByte(lang.Value)); 
+0

cela aide beaucoup. Merci :) – Vayne