580 Stimmen

Attribute des Enum-Wertes abrufen

Ich würde gerne wissen, ob es möglich ist, Attribute der enum Werte und nicht der enum selbst? Angenommen, ich habe zum Beispiel folgendes enum :

using System.ComponentModel; // for DescriptionAttribute

enum FunkyAttributesEnum
{
    [Description("Name With Spaces1")]
    NameWithoutSpaces1,    
    [Description("Name With Spaces2")]
    NameWithoutSpaces2
}

Was ich will, ist der Enum-Typ gegeben, produzieren 2-Tupel von Enum-String-Wert und seine Beschreibung.

Der Wert war einfach:

Array values = System.Enum.GetValues(typeof(FunkyAttributesEnum));
foreach (int value in values)
    Tuple.Value = Enum.GetName(typeof(FunkyAttributesEnum), value);

Aber wie erhalte ich den Wert des Attributs description, um die Tuple.Desc ? Ich kann mir vorstellen, wie man es macht, wenn das Attribut zum enum selbst, aber ich weiß nicht, wie ich ihn aus dem Wert der enum .

0 Stimmen

Aus einer anderen Frage stackoverflow.com/questions/469287/

3 Stimmen

Der für die Beschreibung erforderliche Namespace ist System.ComponentModel

0voto

MeTitus Punkte 3281

Und wenn Sie die vollständige Liste der Namen haben möchten, können Sie Folgendes tun

typeof (PharmacyConfigurationKeys).GetFields()
        .Where(x => x.GetCustomAttributes(false).Any(y => typeof(DescriptionAttribute) == y.GetType()))
        .Select(x => ((DescriptionAttribute)x.GetCustomAttributes(false)[0]).Description);

-1voto

Parvez Ali Punkte 1

Ich habe eine Erweiterungsmethode erstellt, die die Beschreibung aller Elemente in einer Aufzählung in C# zurückgibt.

public static List<string> GetAllEnumDescriptions(this Type enumType)
    {
        try
        {
            var enumList = Enum.GetValues(enumType).Cast<Enum>().ToList();
            List<string> result = new List<string>();
            foreach (var enumItem in enumList)
            {
                result.Add(enumItem.EnumDescription());
            }
            return result;
        }
        catch (Exception ex)
        {
            return new List<string>();
        }
    }

Diese Methode fügt die Beschreibung der Elemente in einem Enum hinzu, indem sie die eingebaute Erweiterungsmethode EnumDescription() verwendet.

-1voto

Onur Dikmen Punkte 109

Alternativ können Sie auch Folgendes tun:

List<SelectListItem> selectListItems = new List<SelectListItem>();

    foreach (var item in typeof(PaymentTerm).GetEnumValues())
    {
        var type = item.GetType();
        var name = type.GetField(item.ToString()).GetCustomAttributesData().FirstOrDefault()?.NamedArguments.FirstOrDefault().TypedValue.Value.ToString();
        selectListItems.Add(new SelectListItem(name, type.Name));

    }

-1voto

g0rski Punkte 51

Leute, wenn es hilft, werde ich meine Lösung mit euch teilen: Definition des Attributs Benutzerdefiniert:

    [AttributeUsage(AttributeTargets.Field,AllowMultiple = false)]
public class EnumDisplayName : Attribute
{
    public string Name { get; private set; }
    public EnumDisplayName(string name)
    {
        Name = name;
    }
}

Nun, da ich es innerhalb der HtmlHelper-Definition der HtmlHelper-Erweiterung benötigte:

public static class EnumHelper
{
    public static string EnumDisplayName(this HtmlHelper helper,EPriceType priceType)
    {
        //Get every fields from enum
        var fields = priceType.GetType().GetFields();
        //Foreach field skipping 1`st fieldw which keeps currently sellected value
        for (int i = 0; i < fields.Length;i++ )
        {
            //find field with same int value
            if ((int)fields[i].GetValue(priceType) == (int)priceType)
            {
                //get attributes of found field
                var attributes = fields[i].GetCustomAttributes(false);
                if (attributes.Length > 0)
                {
                    //return name of found attribute
                    var retAttr = (EnumDisplayName)attributes[0];
                    return retAttr.Name;
                }
            }
        }
        //throw Error if not found
        throw new Exception("Bd podczas ustalania atrybutów dla typu ceny allegro");
    }
}

Ich hoffe, es hilft

-1voto

Ian P Punkte 12536

Alternativ können Sie auch Folgendes tun:

Dictionary<FunkyAttributesEnum, string> description = new Dictionary<FunkyAttributesEnum, string>()
    {
      { FunkyAttributesEnum.NameWithoutSpaces1, "Name With Spaces1" },
      { FunkyAttributesEnum.NameWithoutSpaces2, "Name With Spaces2" },
    };

Und erhalten Sie die Beschreibung mit den folgenden Angaben:

string s = description[FunkyAttributesEnum.NameWithoutSpaces1];

Meiner Meinung nach ist dies ein effizienterer Weg, um das zu erreichen, was Sie erreichen wollen, da keine Reflexion erforderlich ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X