A volte mi capita di aver bisogno di associare ulteriori valori ad ogni elemento di un enum, quale cosa migliore che utilizzare la reflection ![]()
Partiamo da un semplice enum
public enum eMyEnum
{
Val0=0,
Val1=1,
Val2=2
}
Supponiamo ora di volere associare ad ogni elemento di questo enum una descrizione e un colore.
Creiamo una classe che estende l’interfaccia System.Attribute e che contiene tutti i valori che vogliamo associare agli elementi del enum.
public class MyAttribute : System.Attribute
{
public MyAttribute(string description, string color)
{
_description=description;
_color = color;
}
private string _description;
public string Description
{
get { return _description; }
set { _description = value; }
}
private string _color;
public string Color
{
get { return _color; }
set { _color = value; }
}
}
Ora dobbiamo aggiungere gli attributi agli elementi del nostro enum.
public enum eMyEnum
{
[MyAttribute ("Questo è il valore 0","#FFAAFF")]
Val0=0,
[MyAttribute("Questo è il valore 1", "#FFAAAA")]
Val1=1,
[MyAttribute("Questo è il valore 2", "#AAAAAA")]
Val2=2
}
In questo modo ad ogni elemento dell’enum è associata un’istanza della classe MyAttribute contenente dei valori; non ci resta che recuperare questa istanza:
Importiamo prima di tutto il namespace System.Reflaction
using System.Reflection;
..e successivamente implementiamo il metodo che recupera gli attributi
public static MyAttribute GetAttribute(eMyEnum value)
{
try
{
Type t = typeof(eMyEnum);
FieldInfo fi = t.GetField(value.ToString());
MyAttribute[] att =
(MyAttribute[])fi.GetCustomAttributes(
typeof(MyAttribute),
false);
if (att.Length > 0)
{
return att[0];
}
else
{
return null;
}
}
catch (Exception ex)
{
return null;
}
}
Grazie alla reflection è possibile andare a recuperare tutti gli attributi associati alle property,campi ecc di un tipo. In questo caso mi faccio restituire tutti gli attributi del tipo MyAttribute e prendo il primo della lista (se c’è, altrimenti restituisco null)
Non ci resta che verificare che il tutto funzioni
public void Test()
{
eMyEnum myEnum = eMyEnum.Val1;
MyAttribute att = MyAttribute.GetAttribute(myEnum);
if (att != null)
{
MessageBox.Show(att.Description + " [ Color=" + att.Color + "];");
}
}
Ed ecco il risultato

Quanto mi piace la reflection!! 