Share via


Récupération des informations stockées dans les attributs

Mise à jour : novembre 2007

La récupération d'un attribut personnalisé est un processus simple. Déclarez d'abord une instance de l'attribut que vous souhaitez récupérer. Utilisez ensuite la méthode Attribute.GetCustomAttribute pour initialiser le nouvel attribut sur la valeur de celui que vous souhaitez récupérer. Une fois le nouvel attribut initialisé, vous utilisez simplement ses propriétés pour obtenir les valeurs.

Remarque importante :

Cette rubrique décrit comment récupérer des attributs pour le code chargé dans le contexte d'exécution. Pour récupérer des attributs pour le code chargé dans le contexte de réflexion uniquement, vous devez utiliser la classe CustomAttributeData, comme indiqué dans Comment : charger des assemblys dans le contexte de réflexion uniquement.

Cette section décrit les méthodes de récupération des attributs suivantes :

  • Récupération d'une seule instance d'un attribut

  • Récupération d'instances multiples d'un attribut appliqué à la même portée

  • Récupération d'instances multiples d'un attribut appliqué à différentes portées

Récupération d'une seule instance d'un attribut

Dans l'exemple suivant, le DeveloperAttribute (décrit dans la section précédente) est appliqué à la classe MainApp au niveau de la classe. La méthode GetAttribute utilise GetCustomAttribute pour récupérer les valeurs enregistrées dans DeveloperAttribute au niveau de la classe avant de les afficher dans la console.

using System;

[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(null == MyAttribute)
            {
                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

<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

Ce programme affiche le texte suivant lorsqu'il est exécuté.

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. Cet exemple recherche une telle instance dans MyAttribute et informe l'utilisateur qu'aucun attribut n'a été trouvé. Si le DeveloperAttribute est introuvable dans la portée de la classe, le message suivant s'affiche dans la console.

The attribute was not found. 

Cet exemple suppose que la définition de l'attribut figure dans l'espace de noms en cours. N'oubliez pas d'importer l'espace de noms dans lequel la définition de l'attribut réside si ce n'est pas l'espace de noms en cours.

Récupération d'instances multiples d'un attribut appliqué à la même portée

Dans l'exemple précédent, la classe à inspecter et l'attribut spécifique à rechercher sont passés à GetCustomAttribute. Ce code fonctionne correctement uniquement si une instance d'un attribut est appliquée au niveau de la classe. Cependant, si plusieurs instances d'un attribut sont appliquées au même niveau de classe, la méthode GetCustomAttribute ne récupère pas toutes les informations. Dans les cas où plusieurs instances du même attribut seraient appliquées à la même portée, vous pouvez utiliser Attribute.GetCustomAttributes pour placer toutes les instances d'un attribut dans un tableau. 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. N'oubliez pas que pour appliquer plusieurs attributs au même niveau, true doit être affecté à la propriété AllowMultiple dans l'AttributeUsageAttribute.

L'exemple de code suivant montre comment utiliser la méthode GetCustomAttributes pour créer un tableau référençant toutes les instances de DeveloperAttribute dans les classes données. Les valeurs de tous les attributs sont alors affichées dans la console.

public static void GetAttribute(Type t)
{
    DeveloperAttribute[] MyAttribute =
    (DeveloperAttribute[]) Attribute.GetCustomAttributes(t, typeof (DeveloperAttribute));
    
    if(null == MyAttribute)
    {
        Console.WriteLine("The attribute was not found.");
    }
    else
    {
        for(int i = 0 ; i < MyAttribute.Length ; i++)
        {
            //Get the Name value.    
            Console.WriteLine("The Name Attribute is: {0}." , MyAttribute[i].Name);
            //Get the Level value.  
            Console.WriteLine("The Level Attribute is: {0}." , MyAttribute[i].Level);
            //Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}.", MyAttribute[i].Reviewed);
        }
    }
}
Public Shared Sub GetAttribute(t As Type)
    Dim MyAttribute As DeveloperAttribute() = _
    CType(Attribute.GetCustomAttributes(t, GetType(DeveloperAttribute)), DeveloperAttribute())
       
    If MyAttribute Is Nothing Then
        Console.WriteLine("The attribute was not found.")
    Else
        Dim i As Integer
        For i = 0 To MyAttribute.Length - 1
            'Get the Name value. 
            Console.WriteLine("The Name Attribute is: {0}.", MyAttribute(i).Name)
            'Get the Level value.   
            Console.WriteLine("The Level Attribute is: {0}.", MyAttribute(i).Level)
            'Get the Reviewed value.
            Console.WriteLine("The Reviewed Attribute is: {0}.", MyAttribute(i).Reviewed)
        Next i
    End If
End Sub

Si aucun attribut n'a été trouvé, ce code alerte l'utilisateur. Sinon, les informations contenues dans les deux instances de DeveloperAttribute sont affichées.

Récupération d'instances multiples d'un attribut appliqué à différentes portées

Les méthodes GetCustomAttributes et GetCustomAttribute n'effectuent pas de recherches dans une classe entière et retournent toutes les instances d'un attribut dans cette classe. Elles recherchent plutôt uniquement une méthode ou un membre spécifié à un moment donné. Si une classe a le même attribut appliqué à chaque membre et si vous souhaitez récupérer les valeurs dans tous les attributs appliqués à ces membres, vous devez fournir chaque méthode ou membre individuellement à GetCustomAttributes et GetCustomAttribute.

L'exemple de code suivant prend une classe comme paramètre et recherche le DeveloperAttribute (précédemment défini) au niveau de la classe et dans chaque méthode individuelle de cette classe.

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(null == att)
    {
        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(null == att)
        {
            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 Then
        Console.WriteLine("No attribute in class {0}.", t.ToString())
        Console.WriteLine()
    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}.", att.Reviewed)
        Console.WriteLine()
    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.
    Dim i As Integer
    For i = 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}.", MyMemberInfo(i).ToString())
            Console.WriteLine()
        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}.", MyMemberInfo(i).ToString(), att.Reviewed)
            Console.WriteLine()
        End If
    Next i
End Sub

Si aucune instance du DeveloperAttribute n'est trouvée au niveau de la méthode ou de la classe, la méthode GetAttribute en informe l'utilisateur et affiche le nom de la méthode ou classe qui ne contient pas l'attribut. Si un attribut est trouvé, les champs Name, Level et Reviewed sont affichés dans la console.

Vous pouvez utiliser les membres de la classe Type pour obtenir chacune des méthodes et chacun des membres de la classe passée. Cet exemple interroge d'abord l'objet Type pour obtenir les informations d'attribut au niveau de la classe. Il utilise ensuite 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 d'attribut pour le niveau de méthode. 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.

Voir aussi

Référence

System.Type

Attribute.GetCustomAttribute

Attribute.GetCustomAttributes

Autres ressources

Extension des métadonnées à l'aide des attributs