Rimappare C# enum su valori codificati e viceversa (seconda edizione)

Capita spesso di dover confrontare i valori di un enum con delle stringhe (ad esempio i corrispondenti valori salvati nel database) sia in un senso - da un enum ottenere la corrispondente stringa  che nell'altro - da una stringa ottenere l'enum.

Sfruttando gli extensions method di .NET 3.5 vi ho preparato due agevoli routine riutilizzabili in ogni circostanza, come estensioni del tipo String e Enum.

Consideriamo di avere il seguente enum:

 public enum eOrderStatus
    {
        [Description("PEN")]
        Pending,
        [Description("CAN")]
        Canceled,
        [Description("CON")]
        Confirmed,
        [Description("PAY")]
        Payed,
        [Description("SHI")]
        Shipped
    }

Grazie alle nostre due routine otteniamo la possibilità di scrivere il seguente codice (basta che siano in un namespace importato):

            //dall'enum ottengo la stringa
            string desc = eOrderStatus.Payed.GetDescription();

            //dalla stringa ottengo l'enum
            string code = "PEN";
            eOrderStatus e = code.GetEnumFromCode<eOrderStatus>();

 

Ed ecco le due routine che fanno il lavoro per noi:

            
using System.ComponentModel;
using System.Reflection;  
public static class EnumExtensions
{
 public static string GetDescription(this Enum enumItem)
 {

  FieldInfo fi = enumItem.GetType().GetField(enumItem.ToString());
 
  DescriptionAttribute[] attributes = 
     (DescriptionAttribute[])fi.GetCustomAttributes(
                                       typeof(DescriptionAttribute), false);
 
  return (attributes.Length > 0) ? 
                            attributes[0].Description : enumItem.ToString();
 }

 public static TEnum GetEnumFromCode<TEnum>(this String code)
 {
     Type e = typeof(TEnum);
     foreach (FieldInfo fi in e.GetFields())
     {
       DescriptionAttribute[] attributes = 
        (DescriptionAttribute[])fi.GetCustomAttributes(
                                      typeof(DescriptionAttribute), false);
        
        if (attributes.Length > 0)
         {
             if (attributes[0].Description == code) 
                 return (TEnum)fi.GetValue(fi) ;
         }
     }
     return default(TEnum);
 }
}

Published venerdì 8 febbraio 2008 9.10 by marcodelgatto
Filed under: , ,

Comments

No Comments

Leave a Comment

(required) 
(required) 
(optional)
(required) 
Powered by Community Server (Commercial Edition), by Telligent Systems