¿Cómo obtener la descripción de C # Enum del valor?

Posible duplicado:
Obtener atributos del valor de Enum

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

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

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 saber el valor enum (por ejemplo, 1), ¿cómo puedo recuperar la descripción? En otras palabras, ¿cómo puedo convertir un número entero en un “valor Enum” para pasar a mi método GetDescription?

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

El tipo de datos subyacente por defecto para una enum en C # es una int , puedes simplemente lanzarlo.

Implementé esto de una forma genérica y segura en Uncontrained Melody . Utilizarías:

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

Esta:

  • Asegura (con restricciones de tipo genérico) que el valor realmente es un valor enum
  • Evita el boxeo en tu solución actual
  • Guarda 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 un int a MyEnum , pero si estás haciendo un montón de trabajo enum, vale la pena pensar en utilizar Unconstrained Melody 🙂

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

 public static string DescriptionAttr(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(); 

Para hacer esto más fácil de usar, escribí una extensión genérica:

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

ahora puedo escribir:

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

Nota: reemplace “Enumeraciones” arriba con su nombre de clase

No puede hacer esto fácilmente de forma genérica: solo puede convertir un número entero en un tipo específico de enumeración. Como ha demostrado Nicholas, este es un elenco trivial si solo te importa un tipo de enumeración, pero si quieres escribir un método genérico que pueda manejar diferentes tipos de enumeraciones, las cosas se complican un poco. Desea un método similar a:

 public static string GetEnumDescription(int value) { return GetEnumDescription((Enum)((TEnum)value)); // error! } 

pero esto da como resultado un error del comstackdor que “int no se puede convertir a TEnum” (y si se soluciona esto, “TEnum no se puede convertir a Enum”). Entonces, debes engañar al comstackdor insertando moldes para objetar:

 public static string GetEnumDescription(int value) { return GetEnumDescription((Enum)(object)((TEnum)(object)value)); // ugly, but works } 

Ahora puede llamar a esto para obtener una descripción para cualquier tipo de enumeración que esté a mano:

 GetEnumDescription(1); GetEnumDescription(2);