Extends Attribute and Property Reflection
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();
}
}
}
Lascia un commento