Je devais remplir la liste déroulante de ma liste de pays en utilisant Enum. J'ai donc besoin de la description de la valeur Enum et de cette valeur d'index. Mes conditions:
Mon énumération:
public class CountryModel { public int CountryId { get; set; } public string CountryName { get; set; } }
Mon modèle:
public enum CountryListEnum { [Description("United Kingdom")] UnitedKingdom = 0, [Description("United States")] UnitedStates = 1, [Description("Afghanistan")] Afghanistan = 2, [Description("Albania")] Albania = 3, }
3 Réponses :
Je pense que cela devrait vous aider avec une mise en œuvre.
foreach (var item in Enum.GetValues(typeof(CountryListEnum))) { CountryModel myModel = new CountryModel(); myModel.CountryId = item.GetHashCode(); var type = typeof(CountryListEnum); var memInfo = type.GetMember(item.ToString()); var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); var description = ((DescriptionAttribute)attributes[0]).Description; myModel.CountryName = description; }
Modifier
Comme d'autres l'ont souligné, ce qui précède ne récupérera pas la description . Voici une mise à jour sur la façon de mettre en œuvre la nouvelle tentative d'attribut de description.
foreach (var item in Enum.GetValues(typeof(CountryListEnum))) { CountryModel myModel = new CountryModel(); myModel.CountryId = item.GetHashCode(); myModel.CountryName = item.ToString(); }
Cela obtient le nom du pays britannique comme «Royaume-Uni» (sans l'espace) plutôt que «Royaume-Uni». C'est peut-être suffisant, mais pourquoi auriez-vous la description alors?
Il cherche l'élément «Description», vérifiez ma réponse
Pour obtenir la valeur d'index, vous pouvez simplement convertir l'énumération en un entier. L'obtention de l'attribut description est un peu plus compliquée. Peut-être quelque chose comme ça
public enum CountryListEnum { [Description("United Kingdom")] UnitedKingdom = 0, [Description("United States")] UnitedStates = 1, [Description("Afghanistan")] Afghanistan = 2, [Description("Albania")] Albania = 3, } static void Main(string[] args) { foreach (var country in Enum.GetValues(typeof(CountryListEnum)).Cast<CountryListEnum>()) { Console.WriteLine($"Index: {(int)country}"); Console.WriteLine($"Description: {GetDescription(country)}"); } } public static string GetDescription(Enum value) { Type type = value.GetType(); string name = Enum.GetName(type, value); if (name != null) { System.Reflection.FieldInfo field = type.GetField(name); if (field != null) { if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attr) { return attr.Description; } } } return null; }
Je pense que c'est ce que vous recherchez.
var model = new List<CountryModel>(); foreach (var item in Enum.GetValues(typeof(CountryListEnum))) { model.Add(new CountryModel { CountryId = (int)item, CountryName = ((DescriptionAttribute)item.GetType().GetField(item.ToString()).GetCustomAttribute(typeof(DescriptionAttribute), false)).Description }); }
Je ne peux pas compiler ça. Il se plaint que le paramètre de GetCustomAttribute doit être un booléen - pas un type.
@HansKilian Mon erreur, maintenant vous pouvez la copier.
Qu'est-ce qui vous en empêche?
qu'est-ce qu'un index enum?
@lzzy je ne sais pas comment faire. Je m'attends à un générique en une seule ligne de code comme générique
@TheGeneral que 0, 1, 2 .. qui vaut
J'ai besoin de ces valeurs d'index pour l'identifiant du pays et la valeur de la description pour countryName
@BalakrishnanG donc vous voulez retourner toutes les valeurs dans une liste ou un dictionnaire?
@preciousbetine Oui. Mais je veux revenir en tant que modèle. J'aime la liste