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