1
votes

Comment obtenir toutes les valeurs d'énumération attribuées à mon modèle de retour en tant que liste en c #?

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:

  1. Je veux toute la description de la valeur Enum avec la valeur du numéro d'index.
  2. Je ne veux pas de valeur d'Enum, mais j'ai besoin d'une description et d'un index.

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,
    }


7 commentaires

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


3 Réponses :


0
votes

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();
        }


2 commentaires

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



1
votes

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;
}


0 commentaires

0
votes

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
    });
}


2 commentaires

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.