Domanda

Sto cercando una libreria open source o esempi per lavorare con i tipi di Enum in .Net. Oltre alle estensioni standard che le persone usano per Enums (TypeParse, ecc.), Ho bisogno di un modo per eseguire operazioni come la restituzione del valore dell'attributo Descrizione per un dato valore di enumerazione o per restituire un valore di enumerazione che ha un valore di attributo Descrizione che corrisponde a una determinata stringa.

Ad esempio:

//if extension method
var race = Race.FromDescription("AA") // returns Race.AfricanAmerican
//and
string raceDescription = Race.AfricanAmerican.GetDescription() //returns "AA"
È stato utile?

Soluzione

Se non ce n'è già uno, iniziane uno! Probabilmente puoi trovare tutti i metodi di cui hai bisogno da altre risposte qui su StackOverflow: basta arrotolarli in un progetto. Eccone alcuni per iniziare:

Ottenere valore di enum Descrizione:

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

Ottenere un valore enum nullable dalla stringa:

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

Altri suggerimenti

L'altro giorno ho letto questo post sul blog sull'uso delle classi anziché di enum:

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

Propone l'uso di una classe astratta come base per le classi enum. La classe base ha cose come uguaglianza, analisi, confronto, ecc.

Usandolo, puoi avere lezioni per i tuoi enum in questo modo (esempio tratto dall'articolo):

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) { }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top