Attributi Enum

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

Annunci
Tagged with: , , ,
Pubblicato su C#

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: