Partager via


Accès à des attributs à l'aide de la réflexion (Guide de programmation C#)

Mise à jour : novembre 2007

Le fait de pouvoir définir des attributs personnalisés et de les insérer dans le code source ne présenterait que peu d'intérêt s'il n'y avait la possibilité de récupérer ces informations afin de les manipuler. C# a un système de réflexion qui vous permet de récupérer les informations qui ont été définies avec des attributs personnalisés. La méthode clé est GetCustomAttributes, qui retourne un tableau d'objets qui sont les équivalents des attributs du code source au moment de l'exécution. Cette méthode a plusieurs versions surchargées. Pour plus d'informations, consultez Attribute.

Une définition d'attribut telle que :

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

est, sur le plan conceptuel, équivalente à ceci :

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

Cependant, le code n'est pas exécuté tant que SampleClass n'a pas été interrogée sur les attributs. L'appel de GetCustomAttributes sur SampleClass déclenche la création et l'initialisation d'un objet Author, comme ci-dessus. Si la classe a d'autres attributs, d'autres objets d'attribut sont construits de la même façon. GetCustomAttributes retourne ensuite l'objet Author et tous les autres objets d'attribut dans un tableau. Vous pouvez alors parcourir ce tableau, déterminer les attributs qui ont été appliqués sur la base du type de chaque élément du tableau et extraire des informations à partir des objets des attributs.

Exemple

Voici un exemple complet. Un attribut personnalisé est défini, appliqué à plusieurs entités et récupéré par réflexion.

[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
*/

Voir aussi

Concepts

Guide de programmation C#

Référence

Réflexion (Guide de programmation C#)

Attributs (Guide de programmation C#)

Utilisation d'attributs (Guide de programmation C#)

Levée de l'ambiguïté sur les cibles d'attribut (Guide de programmation C#)

Création d'attributs personnalisés (Guide de programmation C#)

System.Reflection

Attribute