Pregunta

Estoy buscando una biblioteca de código abierto o ejemplos para trabajar con tipos Enum en .Net. Además de las extensiones estándar que usa la gente para Enums (TypeParse, etc.), necesito una forma de realizar operaciones como devolver el valor del atributo Descripción para un valor de enumeración determinado o para devolver un valor de enumeración que tenga un valor de atributo Descripción que coincide con una cadena dada.

Por ejemplo:

//if extension method
var race = Race.FromDescription("AA") // returns Race.AfricanAmerican
//and
string raceDescription = Race.AfricanAmerican.GetDescription() //returns "AA"
¿Fue útil?

Solución

Si no hay uno ya, ¡empieza uno! Probablemente puede encontrar todos los métodos que necesita de otras respuestas aquí en Stackoverflow, simplemente enróllelas en un solo proyecto. Aquí hay algunos para comenzar:

Obtención del valor de enum Descripción:

public static string GetDescription(this Enum value)
{
    FieldInfo field = value.GetType().GetField(value.ToString());
    object[] attribs = field.GetCustomAttributes(typeof(DescriptionAttribute), true));
    if(attribs.Length > 0)
    {
        return ((DescriptionAttribute)attribs[0]).Description;
    }
    return string.Empty;
}

Cómo obtener un valor de enumeración nulable de la cadena:

public static class EnumUtils
{
    public static Nullable<T> Parse<T>(string input) where T : struct
    {
        //since we cant do a generic type constraint
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("Generic Type 'T' must be an Enum");
        }
        if (!string.IsNullOrEmpty(input))
        {
            if (Enum.GetNames(typeof(T)).Any(
                  e => e.Trim().ToUpperInvariant() == input.Trim().ToUpperInvariant()))
            {
                return (T)Enum.Parse(typeof(T), input, true);
            }
        }
        return null;
    }
}

Otros consejos

Leí esta publicación del blog el otro día sobre el uso de clases en lugar de enumeraciones:

http: //www.lostechies .com / blogs / jimmy_bogard / archive / 2008/08/12 / enumeration-classes.aspx

Propone el uso de una clase abstracta para servir como la base de las clases enum. La clase base tiene cosas como igualdad, análisis, comparación, etc.

Usándolo, puedes tener clases para tus enumeraciones como esta (ejemplo tomado de un artículo):

public class EmployeeType : Enumeration
{
    public static readonly EmployeeType Manager 
        = new EmployeeType(0, "Manager");
    public static readonly EmployeeType Servant 
        = new EmployeeType(1, "Servant");
    public static readonly EmployeeType AssistantToTheRegionalManager 
        = new EmployeeType(2, "Assistant to the Regional Manager");

    private EmployeeType() { }
    private EmployeeType(int value, string displayName) : base(value, displayName) { }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top