Recupero di informazioni memorizzate negli attributiRetrieving Information Stored in Attributes

Il recupero di un attributo personalizzato è un processo semplice.Retrieving a custom attribute is a simple process. Dichiarare prima di tutto un'istanza dell'attributo da recuperare.First, declare an instance of the attribute you want to retrieve. Usare quindi il metodo Attribute.GetCustomAttribute per inizializzare il nuovo attributo per il valore dell'attributo da recuperare.Then, use the Attribute.GetCustomAttribute method to initialize the new attribute to the value of the attribute you want to retrieve. Dopo avere inizializzato il nuovo attributo, è sufficiente usarne le proprietà per ottenere i valori.Once the new attribute is initialized, you simply use its properties to get the values.

Importante

Questo argomento descrive come recuperare gli attributi personalizzati per il codice caricato nel contesto di esecuzione.This topic describes how to retrieve attributes for code loaded into the execution context. Per recuperare gli attributi per il codice caricato nel contesto di sola reflection, è necessario usare la classe CustomAttributeData, come illustrato in Procedura: Caricare assembly nel contesto Reflection-Only.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.

Questa sezione descrive i modi seguenti per recuperare gli attributi:This section describes the following ways to retrieve attributes:

Recupero di una singola istanza di un attributoRetrieving a Single Instance of an Attribute

Nell'esempio seguente DeveloperAttribute (descritto nella sezione precedente) viene applicato alla classe MainApp a livello di classe.In the following example, the DeveloperAttribute (described in the previous section) is applied to the MainApp class on the class level. Il GetAttribute metodo usa GetCustomAttribute per recuperare i valori archiviati in DeveloperAttribute a livello di classe prima di visualizzarli nella 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
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

Questo programma visualizza il testo seguente quando viene eseguito.This program displays the following text when executed.

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

Se l'attributo non viene trovato, il metodo GetCustomAttribute inizializza MyAttribute per un valore null.If the attribute is not found, the GetCustomAttribute method initializes MyAttribute to a null value. Questo esempio cerca tale istanza in MyAttribute e informa l'utente se non vengono trovati attributi.This example checks MyAttribute for such an instance and notifies the user if no attribute is found. Se DeveloperAttribute non viene trovato nell'ambito della classe, viene visualizzato il messaggio seguente nella console.If the DeveloperAttribute is not found in the class scope, the following message displays to the console.

The attribute was not found.   

Questo esempio presuppone che la definizione dell'attributo sia nello spazio dei nomi corrente.This example assumes that the attribute definition is in the current namespace. Ricordare di importare lo spazio dei nomi in cui si trova la definizione dell'attributo se non è inclusa nello spazio dei nomi corrente.Remember to import the namespace in which the attribute definition resides if it is not in the current namespace.

Recupero di più istanze di un attributo applicate allo stesso ambitoRetrieving Multiple Instances of an Attribute Applied to the Same Scope

Nell'esempio precedente la classe da analizzare e l'attributo specifico da trovare vengono passati a GetCustomAttribute.In the previous example, the class to inspect and the specific attribute to find are passed to GetCustomAttribute. Tale codice funziona correttamente solo se un'istanza di un attributo viene applicata a livello di classe.That code works well if only one instance of an attribute is applied on the class level. Se tuttavia più istanze di un attributo vengono applicate allo stesso livello di classe, il metodo GetCustomAttribute non recupera tutte le informazioni.However, if multiple instances of an attribute are applied on the same class level, the GetCustomAttribute method does not retrieve all the information. Nei casi in cui più istanze dello stesso attributo vengono applicate allo stesso ambito, è possibile usare Attribute.GetCustomAttributes per inserire tutte le istanze di un attributo in una matrice.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. Se ad esempio due istanze di DeveloperAttribute vengono applicate a livello di classe della stessa classe, il metodo GetAttribute può essere modificato per visualizzare le informazioni trovate in entrambi gli attributi.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. Si ricordi che, per applicare più attributi allo stesso livello, l'attributo deve essere definito con la proprietà AllowMultiple impostata su true in 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'esempio di codice seguente illustra come usare il metodo GetCustomAttributes per creare una matrice che fa riferimento a tutte le istanze di DeveloperAttribute in una determinata classe.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. I valori di tutti gli attributi vengono quindi visualizzati nella 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

Se non vengono trovati attributi, questo codice avvisa l'utente.If no attributes are found, this code alerts the user. In caso contrario, vengono visualizzate le informazioni contenute in entrambe le istanze di DeveloperAttribute.Otherwise, the information contained in both instances of DeveloperAttribute is displayed.

Recupero di più istanze di un attributo applicate ad ambiti diversiRetrieving Multiple Instances of an Attribute Applied to Different Scopes

I metodi GetCustomAttributes e GetCustomAttribute non eseguono la ricerca in un'intera classe e non restituiscono tutte le istanze di un attributo in tale classe.The GetCustomAttributes and GetCustomAttribute methods do not search an entire class and return all instances of an attribute in that class. Cercano invece solo un metodo o membro specificato per volta.Rather, they search only one specified method or member at a time. Se si ha una classe con lo stesso attributo applicato a ogni membro e si vogliono recuperare i valori in tutti gli attributi applicati a tali membri, è necessario fornire ogni metodo o membro singolarmente a GetCustomAttributes e 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'esempio di codice seguente accetta una classe come parametro e cerca DeveloperAttribute (definito in precedenza) a livello di classe e in ogni singolo metodo di tale 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

Se non vengono trovate istanze di DeveloperAttribute al livello di metodo o a livello di classe, il metodo GetAttribute notifica all'utente che non sono stati trovati attributi e visualizza il nome del metodo o della classe che non contiene l'attributo.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. Se viene trovato un attributo, i campi Name, Level e Reviewed vengono visualizzati nella console.If an attribute is found, the Name, Level, and Reviewed fields are displayed to the console.

È possibile usare i membri della classe Type per ottenere i singoli metodi e membri nella classe passata.You can use the members of the Type class to get the individual methods and members in the passed class. Questo esempio esegue prima di tutto una query dell'oggetto Type per ottenere informazioni sugli attributi per il livello di classe.This example first queries the Type object to get attribute information for the class level. Usa quindi Type.GetMethods per inserire le istanze di tutti i metodi in una matrice di oggetti System.Reflection.MemberInfo per recuperare informazioni sugli attributi per il livello di metodo.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. È anche possibile usare il metodo Type.GetProperties per verificare la presenza di attributi a livello di proprietà o Type.GetConstructors per verificare la presenza di attributi a livello di costruttore.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.

Vedere ancheSee also