¿Cómo obtener la descripción de C# Enum a partir del valor? [duplicar]
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?
int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);
El tipo de datos subyacente predeterminado para an enum
en C# es an int
, puedes simplemente convertirlo.
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 int
a MyEnum
, pero si estás haciendo mucho trabajo de enumeración, vale la pena pensar en usar Unconstrained Melody :)
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();