Ho scritto una versione aggiornata di questo post qui.
Spesso capita di utilizzare degli enum nel codice di logica di business e poi di doverli convertire in valori codificati per il salvataggio su database: questo spesso implica un mappaggio manuale dai valori enum ai valori codificati, ad esempio con una funzione di tipo switch.
Grazie a Reflection e agli attributi di System.ComponentModel si possono invece associare nativamente i valori codificati agli enum e recuperarli all’occorrenza in modo diretto.
Ecco come procedere.
Innanzitutto quando si crea l’enum gli si associano i valori codificati, attraverso l’attributo Description:
using System;
using System.ComponentModel;
public enum eOrderStatus
{
[Description("PEN")]
Pending,
[Description("CAN")]
Canceled,
[Description("CON")]
Confirmed,
[Description("PAY")]
Payed,
[Description("SHI")]
Shipped
}
Poi includete questa classe di utility nel vostro progetto, che contiene il metodo di recupero del valore che usa reflection:
using System;
using System.Reflection;
using System.ComponentModel;
public class EnumHelper
{
public static string GetCodeFromEnum(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
}
}
A questo punto il gioco è fatto; quando avete bisogno di ottenere il valore codificato corrispondente a un certo valore di enum è sufficiente operare come nel seguente esempio:
[…]
string orderStatus = EnumHelper.GetCodeFromEnum(newStatus);
[…]