Vediamo come estendere la classe Attribute ed usare la Reflection sulle Proprietà di una classe.
Vediamo anche come ricavare gli attributi impostati sulle Proprietà di una classe Automobile.
using System;
using System.Reflection;
![]()
namespace CodeSnippet.it
{
public enum Priorita{Alta=0, Media = 1, Bassa = 2}
![]()
class Automobile
{
private String colore;
private String marca;
![]()
[AttributiAutomobile(Priorita = Priorita.Media)]
public String Colore {
get { return this.colore; }
set { this.colore = value; }
}
![]()
[AttributiAutomobile(Priorita = Priorita.Alta)]
public String Marca
{
get { return this.marca; }
set { this.marca = value; }
}
![]()
public Automobile()
{
// Costruttore
this.marca = "FIAT";
this.colore = "NERO";
}
}
![]()
//System.AttributeTargets.Property indica che gli attributi
//vanno usati sulle Property di una classe
[System.AttributeUsage(System.AttributeTargets.Property)]
public class AttributiAutomobile : Attribute
{
private Priorita priorita;
![]()
public Priorita Priorita
{
get { return this.priorita; }
set { this.priorita = value; }
}
}
![]()
class Program
{
static void Main(string[] args)
{
Type t = typeof(Automobile);
![]()
//Recupero la collection di tutte le Proprietà del Type Automobile.
PropertyInfo[] propInfo = t.GetProperties();
![]()
//Volendo si può recuperare anche una singola proprietà
PropertyInfo p_Colore = t.GetProperty("Colore");
![]()
//Creo un oggetto di tipo Automobile
Automobile myAuto = new Automobile();
![]()
//Mostro i valori assegnati dal costruttore
Console.WriteLine("Colore: " + p_Colore.GetValue(myAuto, null).ToString());
Console.WriteLine("Marca: " + myAuto.Marca);
![]()
//per ogni Proprietà mostro l'attributo Priorità
foreach (PropertyInfo p in propInfo)
{
//Mostro il nome della Property
Console.WriteLine("Nome Proprietà: " + p.Name);
//Mostro il tipo della Property
Console.WriteLine("Tipo Proprietà:" + p.PropertyType.Name);
![]()
//Recupero gli attributi
AttributiAutomobile _at = (AttributiAutomobile)Attribute.GetCustomAttribute(p, typeof(AttributiAutomobile));
![]()
//Mostro il valore dell'Attributo Priorità impostato sulle singole Proprietà
Console.WriteLine("Priorità:" + _at.Priorita.ToString());
![]()
//Assegno dinamicamente un valore alla Proprietà
p.SetValue(myAuto, "Valore assegnato mediante Reflection", null);
}
![]()
//Mostro i valori assegnati dinamicamente
Console.WriteLine("Colore: " + myAuto.Colore);
Console.WriteLine("Marca: " + myAuto.Marca);
![]()
Console.Read();
}
}
}
No comments yet.
Leave a comment