tutorial - Come ottenere la descrizione di C#Enum dal valore?




c# enum tutorial (4)

Possibile duplicato:
Ottenere attributi del valore di Enum

Ho un enum con attributi di descrizione come questo:

public enum MyEnum
{
    Name1 = 1,
    [Description("Here is another")]
    HereIsAnother = 2,
    [Description("Last one")]
    LastOne = 3
}

Ho trovato questo bit di codice per recuperare la descrizione basata su un Enum

public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);

    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}

Questo mi permette di scrivere codice come:

var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
                         select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };

Quello che voglio fare è conoscere il valore enum (es. 1) - come posso recuperare la descrizione? In altre parole, come posso convertire un intero in un "valore Enum" per passare al metodo GetDescription?


Ho messo insieme il codice dalla risposta accettata in un metodo di estensione generico, quindi potrebbe essere utilizzato per tutti i tipi di oggetti:

public static string DescriptionAttr<T>(this T source)
{
    FieldInfo fi = source.GetType().GetField(source.ToString());

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false);

    if (attributes != null && attributes.Length > 0) return attributes[0].Description;
    else return source.ToString();
}

Usando un enum come nel post originale, o qualsiasi altra classe la cui proprietà è decorata con l'attributo Description, il codice può essere consumato in questo modo:

string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();

L'ho implementato in un modo generico e sicuro per il tipo in Unodystrained Melody: useresti :

string description = Enums.GetDescription((MyEnum)value);

Questo:

  • Assicura (con vincoli di tipo generico) che il valore è davvero un valore enum
  • Evita il pugilato nella tua attuale soluzione
  • Memorizza nella cache tutte le descrizioni per evitare l'uso della riflessione su ogni chiamata
  • Ha un sacco di altri metodi, inclusa la possibilità di analizzare il valore dalla descrizione

Mi rendo conto che la risposta principale era solo il cast da un int a MyEnum , ma se stai facendo un sacco di lavoro su enum vale la pena pensare all'utilizzo di Unodystrained Melody :)


Per semplificare l'utilizzo, ho scritto un'estensione generica:

public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct
{
    return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue));
}

ora posso scrivere:

        MyEnum my = MyEnum.HereIsAnother;
        string description = my.ToDescription();
        System.Diagnostics.Debug.Print(description);

Nota: sostituisci "Enumerazioni" sopra con il nome della tua classe


int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

Il tipo di dati di base predefinito per un enum in C # è un int , puoi solo lanciarlo.





enums