español enum description c# enums

description - enum c# int



¿Cómo obtener C#Enum descripción de valor? (5)

Posible duplicado:
Obtención de atributos de valor de Enum

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 bit 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 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 Enum" para pasar a mi método GetDescription?


Implementé esto de una manera genérica y segura para tipos de letra en una melodía sin restricciones : usarías:

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

Esta:

  • Asegura (con restricciones de tipo genérico) que el valor realmente es un valor enumeración
  • Evita el boxeo en tu solución actual.
  • Guarda todas las descripciones en caché para evitar utilizar la reflexión en cada llamada.
  • Tiene un montón de 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 lanzamiento de un int a MyEnum , pero si está haciendo un gran trabajo de enumeración, vale la pena pensar en usar una melodía sin restricciones :)


No puede hacer esto fácilmente de una manera genérica: solo puede convertir un número entero a un tipo específico de enumeración. Como ha demostrado Nicholas, este es un reparto 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 más. Quieres un método a lo largo de las líneas de:

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

pero esto da como resultado un error del compilador de que "int no se puede convertir a TEnum" (y si se soluciona esto, ese "TEnum no se puede convertir a Enum"). Así que necesitas engañar al compilador insertando casts en el objeto:

public static string GetEnumDescription<TEnum>(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 a la mano:

GetEnumDescription<MyEnum>(1); GetEnumDescription<YourEnum>(2);


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

public static string ToDescription<TEnum>(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


Reuní 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();


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

El tipo de datos subyacente predeterminado para una enum en C # es un int , simplemente puede convertirlo.