Récupération des informations stockées dans les attributsRetrieving Information Stored in Attributes

La récupération d’un attribut personnalisé est un processus simple.Retrieving a custom attribute is a simple process. Tout d’abord, déclarez une instance de l’attribut que vous souhaitez récupérer.First, declare an instance of the attribute you want to retrieve. Ensuite, utilisez la méthode Attribute.GetCustomAttribute pour initialiser le nouvel attribut à la valeur de l’attribut que vous souhaitez récupérer.Then, use the Attribute.GetCustomAttribute method to initialize the new attribute to the value of the attribute you want to retrieve. Une fois le nouvel attribut initialisé, vous utilisez simplement ses propriétés pour obtenir les valeurs.Once the new attribute is initialized, you simply use its properties to get the values.

Important

Cette rubrique explique comment récupérer des attributs pour le code chargé dans le contexte d'exécution.This topic describes how to retrieve attributes for code loaded into the execution context. Pour récupérer les attributs du code chargé dans le contexte de réflexion uniquement, vous devez utiliser la classe CustomAttributeData, comme indiqué dans Guide pratique pour charger des assemblys dans le contexte de réflexion uniquement.To retrieve attributes for code loaded into the reflection-only context, you must use the CustomAttributeData class, as shown in How to: Load Assemblies into the Reflection-Only Context.

Cette section décrit les méthodes suivantes pour récupérer des attributs :This section describes the following ways to retrieve attributes:

Récupération d’une seule instance d’un attributRetrieving a Single Instance of an Attribute

Dans l’exemple suivant, la méthode DeveloperAttribute (décrite dans la section précédente) est appliquée à la classe MainApp au niveau de la classe.In the following example, the DeveloperAttribute (described in the previous section) is applied to the MainApp class on the class level. La méthode GetAttribute utilise GetCustomAttribute pour récupérer les valeurs stockées dans DeveloperAttribute au niveau de la classe avant de les afficher dans la console.The GetAttribute method uses GetCustomAttribute to retrieve the values stored in DeveloperAttribute on the class level before displaying them to the console.

using namespace System;
using namespace System::Reflection;
using namespace CustomCodeAttributes;

[Developer("Joan Smith", "42", Reviewed = true)]
ref class MainApp
{
public:
    static void Main()
    {
        // Call function to get and display the attribute.
        GetAttribute(MainApp::typeid);
    }

    static void GetAttribute(Type^ t)
    {
        // Get instance of the attribute.
        DeveloperAttribute^ MyAttribute =
            (DeveloperAttribute^) Attribute::GetCustomAttribute(t, DeveloperAttribute::typeid);

        if (MyAttribute == nullptr)
        {
            Console::WriteLine("The attribute was not found.");
        }
        else
        {
            // Get the Name value.
            Console::WriteLine("The Name Attribute is: {0}." , MyAttribute->Name);
            // Get the Level value.
            Console::WriteLine("The Level Attribute is: {0}." , MyAttribute->Level);
            // Get the Reviewed value.
            Console::WriteLine("The Reviewed Attribute is: {0}." , MyAttribute->Reviewed);
        }
    }
};
using System;
using System.Reflection;
using CustomCodeAttributes;

[Developer("Joan Smith", "42", Reviewed = true)]
class MainApp
{
    public static void Main()
    {
        // Call function to get and display the attribute.
        GetAttribute(typeof(MainApp));
    }

    public static void GetAttribute(Type t)
    {
        // Get instance of the attribute.
        DeveloperAttribute MyAttribute =
            (DeveloperAttribute) Attribute.GetCustomAttribute(t, typeof (DeveloperAttribute));

        if (MyAttribute == null)
        {
            Console.WriteLine("The attribute was not found.");
        }
        else
        {
            // Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttribute.Name);
            // Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttribute.Level);
            // Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}." , MyAttribute.Reviewed);
        }
    }
}
Imports System.Reflection
Imports CustomCodeAttributes

<Developer("Joan Smith", "42", Reviewed := True)>
Class MainApp
    Public Shared Sub Main()
        ' Call function to get and display the attribute.
        GetAttribute(GetType(MainApp))
    End Sub

    Public Shared Sub GetAttribute(t As Type)
        ' Get instance of the attribute.
        Dim MyAttribute As DeveloperAttribute =
            CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)

        If MyAttribute Is Nothing Then
            Console.WriteLine("The attribute was not found.")
        Else
            ' Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttribute.Name)
            ' Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttribute.Level)
            ' Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}." , MyAttribute.Reviewed)
        End If
    End Sub
End Class

Lorsqu’il est exécuté, ce programme affiche le texte suivant.This program displays the following text when executed.

The Name Attribute is: Joan Smith.  
The Level Attribute is: 42.  
The Reviewed Attribute is: True.  

Si l’attribut est introuvable, la méthode GetCustomAttribute initialise MyAttribute à une valeur null.If the attribute is not found, the GetCustomAttribute method initializes MyAttribute to a null value. Cet exemple recherche une telle instance dans MyAttribute et avertit l’utilisateur si aucun attribut n’est trouvé.This example checks MyAttribute for such an instance and notifies the user if no attribute is found. Si aucune valeur DeveloperAttribute n’est trouvée dans l’étendue de la classe, le message suivant s’affiche dans la console.If the DeveloperAttribute is not found in the class scope, the following message displays to the console.

The attribute was not found.   

Cet exemple suppose que l’attribut est défini dans l’espace de noms actuel.This example assumes that the attribute definition is in the current namespace. N’oubliez pas d’importer l’espace de noms dans lequel se trouve la définition de l’attribut si celle-ci ne figure pas dans l’espace de noms actuel.Remember to import the namespace in which the attribute definition resides if it is not in the current namespace.

Récupération de plusieurs instances d’un attribut appliqué à la même étendueRetrieving Multiple Instances of an Attribute Applied to the Same Scope

Dans l’exemple précédent, la classe à inspecter et l’attribut spécifique à rechercher sont transmis à GetCustomAttribute.In the previous example, the class to inspect and the specific attribute to find are passed to GetCustomAttribute. Ce code fonctionne correctement uniquement si une instance d’un attribut est appliquée au niveau de la classe.That code works well if only one instance of an attribute is applied on the class level. Toutefois, si plusieurs instances d’un attribut sont appliquées au niveau de la même classe, la méthode GetCustomAttribute ne récupère pas toutes les informations.However, if multiple instances of an attribute are applied on the same class level, the GetCustomAttribute method does not retrieve all the information. Dans les cas où plusieurs instances du même attribut sont appliquées à la même étendue, vous pouvez utiliser Attribute.GetCustomAttributes pour placer toutes les instances d’un attribut dans un tableau.In cases where multiple instances of the same attribute are applied to the same scope, you can use Attribute.GetCustomAttributes to place all instances of an attribute into an array. Par exemple, si deux instances de DeveloperAttribute sont appliquées au niveau de la même classe, la méthode GetAttribute peut être modifiée pour afficher les informations trouvées dans les deux attributs.For example, if two instances of DeveloperAttribute are applied on the class level of the same class, the GetAttribute method can be modified to display the information found in both attributes. N’oubliez pas que pour appliquer plusieurs attributs au même niveau, l’attribut doit être défini avec la propriété AllowMultiple définie sur true dans AttributeUsageAttribute.Remember, to apply multiple attributes on the same level, the attribute must be defined with the AllowMultiple property set to true in the AttributeUsageAttribute.

L’exemple de code suivant montre comment utiliser la méthode GetCustomAttributes pour créer un tableau qui référence toutes les instances de DeveloperAttribute dans une classe donnée.The following code example shows how to use the GetCustomAttributes method to create an array that references all instances of DeveloperAttribute in any given class. Les valeurs de tous les attributs sont ensuite affichées dans la console.The values of all attributes are then displayed to the console.

public:
    static void GetAttribute(Type^ t)
    {
        array<DeveloperAttribute^>^ MyAttributes =
            (array<DeveloperAttribute^>^) Attribute::GetCustomAttributes(t, DeveloperAttribute::typeid);

        if (MyAttributes->Length == 0)
        {
            Console::WriteLine("The attribute was not found.");
        }
        else
        {
            for (int i = 0 ; i < MyAttributes->Length; i++)
            {
                // Get the Name value.
                Console::WriteLine("The Name Attribute is: {0}." , MyAttributes[i]->Name);
                // Get the Level value.
                Console::WriteLine("The Level Attribute is: {0}." , MyAttributes[i]->Level);
                // Get the Reviewed value.
                Console::WriteLine("The Reviewed Attribute is: {0}.", MyAttributes[i]->Reviewed);
            }
        }
    }
public static void GetAttribute(Type t)
{
    DeveloperAttribute[] MyAttributes =
        (DeveloperAttribute[]) Attribute.GetCustomAttributes(t, typeof (DeveloperAttribute));

    if (MyAttributes.Length == 0)
    {
        Console.WriteLine("The attribute was not found.");
    }
    else
    {
        for (int i = 0 ; i < MyAttributes.Length ; i++)
        {
            // Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttributes[i].Name);
            // Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttributes[i].Level);
            // Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}.", MyAttributes[i].Reviewed);
        }
    }
}
Public Shared Sub GetAttribute(t As Type)
    Dim MyAttributes() As DeveloperAttribute =
        CType(Attribute.GetCustomAttributes(t, GetType(DeveloperAttribute)), DeveloperAttribute())

    If MyAttributes.Length = 0 Then
        Console.WriteLine("The attribute was not found.")
    Else
        For i As Integer = 0 To MyAttributes.Length - 1
            ' Get the Name value.
            Console.WriteLine("The Name Attribute is: {0}." , MyAttributes(i).Name)
            ' Get the Level value.
            Console.WriteLine("The Level Attribute is: {0}." , MyAttributes(i).Level)
            ' Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}.", MyAttributes(i).Reviewed)
        Next i
    End If
End Sub

Si aucun attribut n’est trouvé, ce code avertit l’utilisateur.If no attributes are found, this code alerts the user. Sinon, les informations contenues dans les deux instances de DeveloperAttribute s’affichent.Otherwise, the information contained in both instances of DeveloperAttribute is displayed.

Récupération de plusieurs instances d’un attribut appliqué à différentes étenduesRetrieving Multiple Instances of an Attribute Applied to Different Scopes

Les méthodes GetCustomAttributes et GetCustomAttribute ne recherchent pas une classe entière et retournent toutes les instances d’un attribut dans cette classe.The GetCustomAttributes and GetCustomAttribute methods do not search an entire class and return all instances of an attribute in that class. Elles recherchent plutôt une seule méthode spécifiée ou un membre à la fois.Rather, they search only one specified method or member at a time. Si vous utilisez une classe avec le même attribut appliqué à chaque membre et que vous souhaitez récupérer les valeurs de tous les attributs appliqués à ces membres, vous devez fournir chaque méthode ou membre individuellement à GetCustomAttributes et à GetCustomAttribute.If you have a class with the same attribute applied to every member and you want to retrieve the values in all the attributes applied to those members, you must supply every method or member individually to GetCustomAttributes and GetCustomAttribute.

L’exemple de code suivant prend une classe en tant que paramètre et recherche l’attribut DeveloperAttribute (défini précédemment) au niveau de la classe et dans chaque méthode individuelle de cette classe.The following code example takes a class as a parameter and searches for the DeveloperAttribute (defined previously) on the class level and on every individual method of that class.

public:
    static void GetAttribute(Type^ t)
    {
        DeveloperAttribute^ att;

        // Get the class-level attributes.

        // Put the instance of the attribute on the class level in the att object.
        att = (DeveloperAttribute^) Attribute::GetCustomAttribute (t, DeveloperAttribute::typeid);

        if (att == nullptr)
        {
            Console::WriteLine("No attribute in class {0}.\n", t->ToString());
        }
        else
        {
            Console::WriteLine("The Name Attribute on the class level is: {0}.", att->Name);
            Console::WriteLine("The Level Attribute on the class level is: {0}.", att->Level);
            Console::WriteLine("The Reviewed Attribute on the class level is: {0}.\n", att->Reviewed);
        }

        // Get the method-level attributes.

        // Get all methods in this class, and put them
        // in an array of System.Reflection.MemberInfo objects.
        array<MemberInfo^>^ MyMemberInfo = t->GetMethods();

        // Loop through all methods in this class that are in the
        // MyMemberInfo array.
        for (int i = 0; i < MyMemberInfo->Length; i++)
        {
            att = (DeveloperAttribute^) Attribute::GetCustomAttribute(MyMemberInfo[i], DeveloperAttribute::typeid);
            if (att == nullptr)
            {
                Console::WriteLine("No attribute in member function {0}.\n" , MyMemberInfo[i]->ToString());
            }
            else
            {
                Console::WriteLine("The Name Attribute for the {0} member is: {1}.",
                    MyMemberInfo[i]->ToString(), att->Name);
                Console::WriteLine("The Level Attribute for the {0} member is: {1}.",
                    MyMemberInfo[i]->ToString(), att->Level);
                Console::WriteLine("The Reviewed Attribute for the {0} member is: {1}.\n",
                    MyMemberInfo[i]->ToString(), att->Reviewed);
            }
        }
    }
public static void GetAttribute(Type t)
{
    DeveloperAttribute att;

    // Get the class-level attributes.

    // Put the instance of the attribute on the class level in the att object.
    att = (DeveloperAttribute) Attribute.GetCustomAttribute (t, typeof (DeveloperAttribute));

    if (att == null)
    {
        Console.WriteLine("No attribute in class {0}.\n", t.ToString());
    }
    else
    {
        Console.WriteLine("The Name Attribute on the class level is: {0}.", att.Name);
        Console.WriteLine("The Level Attribute on the class level is: {0}.", att.Level);
        Console.WriteLine("The Reviewed Attribute on the class level is: {0}.\n", att.Reviewed);
    }

    // Get the method-level attributes.

    // Get all methods in this class, and put them
    // in an array of System.Reflection.MemberInfo objects.
    MemberInfo[] MyMemberInfo = t.GetMethods();

    // Loop through all methods in this class that are in the
    // MyMemberInfo array.
    for (int i = 0; i < MyMemberInfo.Length; i++)
    {
        att = (DeveloperAttribute) Attribute.GetCustomAttribute(MyMemberInfo[i], typeof (DeveloperAttribute));
        if (att == null)
        {
            Console.WriteLine("No attribute in member function {0}.\n" , MyMemberInfo[i].ToString());
        }
        else
        {
            Console.WriteLine("The Name Attribute for the {0} member is: {1}.",
                MyMemberInfo[i].ToString(), att.Name);
            Console.WriteLine("The Level Attribute for the {0} member is: {1}.",
                MyMemberInfo[i].ToString(), att.Level);
            Console.WriteLine("The Reviewed Attribute for the {0} member is: {1}.\n",
                MyMemberInfo[i].ToString(), att.Reviewed);
        }
    }
}
Public Shared Sub GetAttribute(t As Type)
    Dim att As DeveloperAttribute

    ' Get the class-level attributes.

    ' Put the instance of the attribute on the class level in the att object.
    att = CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)

    If att Is Nothing
        Console.WriteLine("No attribute in class {0}.\n", t.ToString())
    Else
        Console.WriteLine("The Name Attribute on the class level is: {0}.", att.Name)
        Console.WriteLine("The Level Attribute on the class level is: {0}.", att.Level)
        Console.WriteLine("The Reviewed Attribute on the class level is: {0}.\n", att.Reviewed)
    End If

    ' Get the method-level attributes.

    ' Get all methods in this class, and put them
    ' in an array of System.Reflection.MemberInfo objects.
    Dim MyMemberInfo() As MemberInfo = t.GetMethods()

    ' Loop through all methods in this class that are in the
    ' MyMemberInfo array.
    For i As Integer = 0 To MyMemberInfo.Length - 1
        att = CType(Attribute.GetCustomAttribute(MyMemberInfo(i), _
            GetType(DeveloperAttribute)), DeveloperAttribute)
        If att Is Nothing Then
            Console.WriteLine("No attribute in member function {0}.\n" , MyMemberInfo(i).ToString())
        Else
            Console.WriteLine("The Name Attribute for the {0} member is: {1}.",
                MyMemberInfo(i).ToString(), att.Name)
            Console.WriteLine("The Level Attribute for the {0} member is: {1}.",
                MyMemberInfo(i).ToString(), att.Level)
            Console.WriteLine("The Reviewed Attribute for the {0} member is: {1}.\n",
                MyMemberInfo(i).ToString(), att.Reviewed)
        End If
    Next
End Sub

Si aucune instance de l’attribut DeveloperAttribute n’est trouvée au niveau de la méthode ou de la classe, la méthode GetAttribute avertit l’utilisateur qu’aucun attribut n’a été trouvé puis affiche le nom de la méthode ou classe qui ne contient pas cet attribut.If no instances of the DeveloperAttribute are found on the method level or class level, the GetAttribute method notifies the user that no attributes were found and displays the name of the method or class that does not contain the attribute. Si un attribut est trouvé, les champs Name, Level et Reviewed apparaissent dans la console.If an attribute is found, the Name, Level, and Reviewed fields are displayed to the console.

Vous pouvez utiliser les membres de la classe Type pour obtenir les méthodes individuelles et les membres de la classe transmise.You can use the members of the Type class to get the individual methods and members in the passed class. Cet exemple interroge d’abord l’objet Type pour obtenir des informations sur les attributs au niveau de la classe.This example first queries the Type object to get attribute information for the class level. Puis il utilise Type.GetMethods pour placer des instances de toutes les méthodes dans un tableau d’objets System.Reflection.MemberInfo pour récupérer des informations sur les attributs au niveau de la méthode.Next, it uses Type.GetMethods to place instances of all methods into an array of System.Reflection.MemberInfo objects to retrieve attribute information for the method level. Vous pouvez également utiliser la méthode Type.GetProperties pour vérifier les attributs au niveau de la propriété, ou Type.GetConstructors pour vérifier les attributs au niveau du constructeur.You can also use the Type.GetProperties method to check for attributes on the property level or Type.GetConstructors to check for attributes on the constructor level.

Voir aussiSee also