¿Cómo obtener la descripción de C# Enum a partir del valor? [duplicar]

Resuelto davekaro asked hace 14 años • 5 respuestas

Tengo una enumeración con atributos de descripción como este:

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

Encontré este fragmento de código para recuperar la descripción basada en una enumeración

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

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

    if (attributes != null && attributes.Any())
    {
        return attributes.First().Description;
    }

    return value.ToString();
}

Esto me permite escribir código como:

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

Lo que quiero hacer es si conozco el valor de enumeración (por ejemplo, 1): ¿cómo puedo recuperar la descripción? En otras palabras, ¿cómo puedo convertir un número entero en un "valor de enumeración" para pasarlo a mi método GetDescription?

davekaro avatar Apr 16 '10 08:04 davekaro
Aceptado
int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

El tipo de datos subyacente predeterminado para an enumen C# es an int, puedes simplemente convertirlo.

Nicholas Piasecki avatar Apr 16 '2010 01:04 Nicholas Piasecki

Actualizar

La biblioteca Unconstrained Melody ya no se mantiene; Se abandonó el soporte a favor de Enums.NET .

En Enums.NET usarías:

string description = ((MyEnum)value).AsString(EnumFormat.Description);

Publicación original

Implementé esto de una manera genérica y segura en Unconstrained Melody ; usarías:

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

Este:

  • Garantiza (con restricciones de tipo genérico) que el valor realmente sea un valor de enumeración
  • Evita el boxeo en su solución actual.
  • Almacena en caché todas las descripciones para evitar el uso de la reflexión en cada llamada.
  • Tiene muchos otros métodos, incluida la capacidad de analizar el valor de la descripción.

Me doy cuenta de que la respuesta principal fue solo el elenco de an inta MyEnum, pero si estás haciendo mucho trabajo de enumeración, vale la pena pensar en usar Unconstrained Melody :)

Jon Skeet avatar Apr 16 '2010 02:04 Jon Skeet

Junté el código de la respuesta aceptada en un método de extensión genérico, por lo que podría usarse para todo tipo de objetos:

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 una enumeración como en la publicación original, o cualquier otra clase cuya propiedad esté decorada con el atributo Descripción, el código se puede consumir así:

string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();
Irish avatar Jun 11 '2012 20:06 Irish