Condividi tramite


Accesso agli attributi mediante reflection (Guida per programmatori C#)

Aggiornamento: novembre 2007

Il fatto di poter definire attributi personalizzati e inserirli nel codice sorgente non sarebbe di grande utilità se non fosse in qualche modo possibile accedere a queste informazioni e modificarle. C# dispone di un sistema di reflection che consente di recuperare le informazioni definite con attributi personalizzati. Il metodo chiave è GetCustomAttributes, che restituisce una matrice di oggetti corrispondenti agli attributi del codice sorgente in fase di esecuzione. Questo metodo dispone di diverse versioni di overload. Per ulteriori informazioni, vedere Attribute.

Una specifica di attributo quale la seguente:

[Author("H. Ackerman", version = 1.1)]
class SampleClass

equivale concettualmente a quanto segue:

Author anonymousAuthorObject = new Author("H. Ackerman");
anonymousAuthorObject.version = 1.1;

Il codice non viene tuttavia eseguito fino a quando non sono stati richiesti gli attributi ad SampleClass . Quando si chiama GetCustomAttributes su SampleClass , viene costruito e inizializzato un oggetto Author come illustrato in precedenza. Se la classe dispone di altri attributi, gli altri oggetti attributo verranno costruiti in modo analogo. GetCustomAttributes restituirà quindi l'oggetto Author e gli eventuali altri oggetti attributo in una matrice. Sarà quindi possibile eseguire iterazioni su questa matrice, determinare quali attributi sono stati applicati in base al tipo di ciascun elemento della matrice ed estrarre informazioni dagli oggetti attributo.

Esempio

Di seguito è riportato un esempio completo. In esso viene definito un attributo personalizzato, che viene quindi applicato a varie entità e recuperato tramite reflection.

[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = true)  // multiuse attribute
]
public class Author : System.Attribute
{
    string name;
    public double version;

    public Author(string name)
    {
        this.name = name;
        version = 1.0;  // Default value
    }

    public string GetName()
    {
        return name;
    }
}

[Author("H. Ackerman")]
private class FirstClass
{
    // ...
}

// No Author attribute
private class SecondClass
{
    // ...
}

[Author("H. Ackerman"), Author("M. Knott", version = 2.0)]
private class ThirdClass
{
    // ...
}

class TestAuthorAttribute
{
    static void Main()
    {
        PrintAuthorInfo(typeof(FirstClass));
        PrintAuthorInfo(typeof(SecondClass));
        PrintAuthorInfo(typeof(ThirdClass));
    }

    private static void PrintAuthorInfo(System.Type t)
    {
        System.Console.WriteLine("Author information for {0}", t);
        System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t);  // reflection

        foreach (System.Attribute attr in attrs)
        {
            if (attr is Author)
            {
                Author a = (Author)attr;
                System.Console.WriteLine("   {0}, version {1:f}", a.GetName(), a.version);
            }
        }
    }
}
/* Output:
    Author information for FirstClass
       H. Ackerman, version 1.00
    Author information for SecondClass
    Author information for ThirdClass
       M. Knott, version 2.00
       H. Ackerman, version 1.00
*/

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Reflection (Guida per programmatori C#)

Attributi (Guida per programmatori C#)

Utilizzo di attributi (Guida per programmatori C#)

Risolvere le ambiguità sulle destinazioni degli attributi (Guida per programmatori C#)

Creazione di attributi personalizzati (Guida per programmatori C#)

System.Reflection

Attribute