Angella Andrea - Italian Blog

Infinita passione per lo sviluppo software !
posts - 133, comments - 216, trackbacks - 9

My Links

News

MIT OpenCourseWare: I'm invested Wikipedia Affiliate Button


Sto leggendo:

Archives

Post Categories

Siti web realizzati

Siti web tecnici

[70-536] - Attributes


Area di riferimento

- Developing applications that use system types and collections
    - Manage data in a .NET Framework application by using the .NET Framework 2.0 system types
        - Attributes



Attributes

Gli attributi permetteno di utilizzare un tipo di programmazione dichiarativa accanto alla classica programmazione imperativa. Gli attributi aggiungono informazioni a tipi, metodi e proprietà, le quali vengono salvate nelle tabelle dei metadati e possono essere interrogate a runtime (mediante una tecnica chiamata Reflection) in modo da alterare dinamicamente l'esecuzione del codice. La FCL definisce tantissimi attributi con differenti scopi ad esempio specificare privilegi di sicurezza, dichiarare capacità come il supporto alla serializzazione, descrivere l'assembly dell'applicazione ecc. Un tipo attributo altro non è che una classe che deriva da System.Attribute. Un attributo può essere applicato in C# utilizzando le parentesi quadre. Vediamo alcuni esempi.

Impostare informazioni relative all'assembly (utilizzando Visual Studio queste e altre impostazioni sono raccolte nel file autogenerato AssemblyInfo.cs):

[assembly: AssemblyTitle("...)]
[assembly: AssemblyDescription("...")]
[assembly: AssemblyConfiguration("...")]
[assembly: AssemblyCompany("...")]
[assembly: AssemblyProduct("...")]
[assembly: AssemblyCopyright("...")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

[assembly: ComVisible(false)]

[assembly: AssemblyVersion("1.0.0.0")]

Fare in modo che una classe possa essere serializzata:

[Serializable]
class Studente
{
  ...
}

Vediamo adesso come definire un attributo (senza alcuna utilità pratica) per specificare il livello di importanza di una classe:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class ImportanzaAttribute : System.Attribute
{
    public ImportanzaAttribute(int livello)
    {
        this.livello = livello;
    }

    public int Livello
    {
        get
        {
            return livello;
        }
        set
        {
            livello = value;
        }
    }

    public string Descrizione
    {
        get
        {
            return descrizione;
        }
        set
        {
            descrizione = value;
        }
    }

    private int livello;
    private string descrizione;
}

[Importanza(1, Descrizione = "Lo studente è importante.")]
class Studente
{
  ...
}

class StudenteIngegneria : Studente
{   
  ...    
}


Notare che la classe attributo definita deriva da System.Attribute e termina con il suffisso Attribute (anche se ciò non è obbligatorio). L'attributo AttributeUsageAttribute definito nel Framework(notare che il C# permette di evitare la digitazione del suffisso Attribute) indica al compilatore dove il nuovo attributo può essere applicato, se può essere applicato più volte e se è un attributo che viene ereditato. In questo caso ImportanzaAttribute può essere applicato soltanto alle classi, non può essere usato più volte per la stessa classe ed è ereditato dalle sottoclassi (come StudenteIngegneria). Decorare la classe Studente con il nuovo attributo è estremamente semplice infatti basta specificare i parametri (obbligatori) richiesti dal costruttore ed eventualmente specificare il valore di alcune proprietà (in questo caso Descrizione). E' compito poi del compilatore serializzare queste informazioni e inserirle nei metadati dell'assembly.

Per controllare se un certo attributo è stato applicato a un tipo è possibile utilizzare il metodo IsDefined come mostrato di seguito:

Studente s1 = new Studente();
StudenteIngegneria s2 = new StudenteIngegneria();

if ( s1.GetType().IsDefined( typeof(ImportanzaAttribute), true) )
{
    Console.WriteLine("s1 è importante");
}
if (s2.GetType().IsDefined(typeof(ImportanzaAttribute), true))
{
    Console.WriteLine("s2 è importante");
}

Output:

s1 è importante
s2 è importante

L'output dimostra che StudenteIngegneria ha ereditato l'attributo. Il secondo parametro di IsDefined infatti specifica se considerare anche gli attributi ereditati nella ricerca.
Il metodo IsDefined però permette soltanto di sapere se un certo attributo è stato applicato.

Per avere l'istanza dell'attributo e quindi poter accedere ai valori delle sue proprietà si deve utilizzare il metodo statico GetCustomAttribute della classe Attribute:

ImportanzaAttribute attributo =
       Attribute.GetCustomAttribute(s2.GetType(), typeof(ImportanzaAttribute), true) as ImportanzaAttribute;

if (attributo != null)
{
    Console.WriteLine("s2 ha livello di importanza: '{0}', Descrizione: '{1}'", attributo.Livello, attributo.Descrizione);  
}

Print | posted on giovedì 30 agosto 2007 01:28 | Filed Under [ Exam 70-536 Application Development Foundation ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET