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!! 