Accesso ad attributi personalizzatiAccessing Custom Attributes

Dopo che gli attributi sono stati associati a elementi del programma, è possibile verificarne l'esistenza ed esaminarne i valori tramite reflection.After attributes have been associated with program elements, reflection can be used to query their existence and values. In .NET Framework versioni 1.0 e 1.1 gli attributi personalizzati vengono esaminati nel contesto di esecuzione.In the .NET Framework version 1.0 and 1.1, custom attributes are examined in the execution context. .NET Framework versione 2.0 offre un nuovo contesto di caricamento di sola reflection, che consente di esaminare il codice che non può essere caricato per l'esecuzione.The .NET Framework version 2.0 provides a new load context, the reflection-only context, which can be used to examine code that cannot be loaded for execution.

Contesto di sola reflectionThe Reflection-Only Context

Il codice caricato nel contesto di sola reflection non può essere eseguito.Code loaded into the reflection-only context cannot be executed. Non è pertanto possibile creare istanze di attributi personalizzati, operazione per cui è richiesta l'esecuzione dei costruttori.This means that instances of custom attributes cannot be created, because that would require executing their constructors. Per caricare ed esaminare gli attributi personalizzati nel contesto di sola reflection, usare la classe CustomAttributeData.To load and examine custom attributes in the reflection-only context, use the CustomAttributeData class. È possibile ottenere istanze di questa classe usando l'overload appropriato del metodo CustomAttributeData.GetCustomAttributes statico.You can obtain instances of this class by using the appropriate overload of the static CustomAttributeData.GetCustomAttributes method. Vedere How to: Load Assemblies into the Reflection-Only Context (Procedura: Caricare assembly nel contesto di sola reflection).See How to: Load Assemblies into the Reflection-Only Context.

Contesto di esecuzioneThe Execution Context

I principali metodi di reflection per l'esecuzione di query sugli attributi nel contesto di esecuzione sono MemberInfo.GetCustomAttributes e Attribute.GetCustomAttributes.The main reflection methods to query attributes in the execution context are MemberInfo.GetCustomAttributes and Attribute.GetCustomAttributes.

L'accessibilità di un attributo personalizzato viene controllata in riferimento all'assembly a cui l'attributo è collegato.The accessibility of a custom attribute is checked with respect to the assembly in which it is attached. In altri termini, si verifica se un metodo di un tipo dell'assembly a cui è collegato l'attributo personalizzato può chiamare il costruttore dell'attributo personalizzato.This is equivalent to checking whether a method on a type in the assembly in which the custom attribute is attached can call the constructor of the custom attribute.

I metodi come Assembly.GetCustomAttributes(Boolean) consentono di controllare la visibilità e l'accessibilità dell'argomento di tipo.Methods such as Assembly.GetCustomAttributes(Boolean) check the visibility and accessibility of the type argument. È possibile recuperare un attributo personalizzato del tipo definito dall'utente tramite GetCustomAttributes solo nel codice dell'assembly che contiene tale tipo.Only code in the assembly that contains the user-defined type can retrieve a custom attribute of that type using GetCustomAttributes.

Nell'esempio in C# riportato di seguito viene rappresentato un tipico modello di progettazione di attributi personalizzati.The following C# example is a typical custom attribute design pattern. Viene illustrato il modello di reflection degli attributi personalizzati adottato dal runtime.It illustrates the runtime custom attribute reflection model.

System.DLL  
public class DescriptionAttribute : Attribute  
{  
}  

System.Web.DLL  
internal class MyDescriptionAttribute : DescriptionAttribute  
{  
}  

public class LocalizationExtenderProvider  
{  
    [MyDescriptionAttribute(...)]  
    public CultureInfo GetLanguage(...)  
    {  
    }  
}  

Se il runtime tenta di recuperare gli attributi personalizzati del tipo di attributo personalizzato pubblico DescriptionAttribute associato al metodo GetLanguage, esegue le azioni seguenti:If the runtime is attempting to retrieve the custom attributes for the public custom attribute type DescriptionAttribute attached to the GetLanguage method, it performs the following actions:

  1. Controlla che l'argomento di tipo DescriptionAttribute a Type.GetCustomAttributes(Tipo tipo) sia pubblico e quindi visibile e accessibile.The runtime checks that the type argument DescriptionAttribute to Type.GetCustomAttributes(Type type) is public, and therefore is visible and accessible.

  2. Controlla che il tipo definito dall'utente MyDescriptionAttribute che deriva da DescriptionAttribute sia visibile e accessibile all'interno dell'assembly System.Web.DLL, in cui è collegato al metodo GetLanguage().The runtime checks that the user-defined type MyDescriptionAttribute that is derived from DescriptionAttribute is visible and accessible within the System.Web.DLL assembly, where it is attached to the method GetLanguage().

  3. Controlla che il costruttore di MyDescriptionAttribute sia visibile e accessibile all'interno dell'assembly System.Web.DLL.The runtime checks that the constructor of MyDescriptionAttribute is visible and accessible within the System.Web.DLL assembly.

  4. Chiama il costruttore di MyDescriptionAttribute con i parametri dell'attributo personalizzato e restituisce il nuovo oggetto al chiamante.The runtime calls the constructor of MyDescriptionAttribute with the custom attribute parameters and returns the new object to the caller.

Il modello di reflection degli attributi personalizzati può perdere istanze di tipi definiti dall'utente all'esterno dell'assembly in cui il tipo è definito.The custom attribute reflection model could leak instances of user-defined types outside the assembly in which the type is defined. Questo modello non differisce da quello in cui si inquadrano i membri della libreria di sistema del runtime, che restituiscono istanze di tipi definiti dall'utente, come Type.GetMethods che restituisce una matrice di oggetti RuntimeMethodInfo.This is no different from the members in the runtime system library that return instances of user-defined types, such as Type.GetMethods returning an array of RuntimeMethodInfo objects. Per impedire a un client di rilevare informazioni su un attributo personalizzato definito dall'utente, definire i membri del tipo come non pubblici.To prevent a client from discovering information about a user-defined custom attribute type, define the type's members to be nonpublic.

Nell'esempio seguente viene illustrato il metodo principale per accedere agli attributi personalizzati tramite reflection.The following example demonstrates the basic way of using reflection to get access to custom attributes.

using namespace System;

public ref class ExampleAttribute : Attribute
{
private:
    String^ stringVal;

public:
    ExampleAttribute()
    {
        stringVal = "This is the default string.";
    }


    property String^ StringValue
    {
        String^ get() { return stringVal; }
        void set(String^ value) { stringVal = value; }
    }
};

[Example(StringValue="This is a string.")]
public ref class Class1
{
public:
    static void Main()
    {
        System::Reflection::MemberInfo^ info = Type::GetType("Class1");
        for each (Object^ attrib in info->GetCustomAttributes(true))
        {
            Console::WriteLine(attrib);
        }
    }
};

int main()
{
    Class1::Main();
}
using System;

public class ExampleAttribute : Attribute
{
    private string stringVal;

    public ExampleAttribute()
    {
        stringVal = "This is the default string.";
    }

    public string StringValue
    {
        get { return stringVal; }
        set { stringVal = value; }
    }
}

[Example(StringValue="This is a string.")]
class Class1
{
    public static void Main()
    {
        System.Reflection.MemberInfo info = typeof(Class1);
        foreach (object attrib in info.GetCustomAttributes(true))
        {
            Console.WriteLine(attrib);
        }
    }
}
Imports System

Public Class ExampleAttribute
    Inherits Attribute

    Private stringVal As String

    Public Sub New()
        stringVal = "This is the default string."
    End Sub

    Public Property StringValue() As String
        Get
            Return stringVal
        End Get
        Set(Value As String)
            stringVal = Value
        End Set
    End Property
End Class

<Example(StringValue := "This is a string.")> _
Class Class1
    Public Shared Sub Main()
    Dim info As System.Reflection.MemberInfo = GetType(Class1)
        For Each attrib As Object In info.GetCustomAttributes(true)
            Console.WriteLine(attrib)
        Next attrib
    End Sub
End Class

Vedere ancheSee Also

MemberInfo.GetCustomAttributes
Attribute.GetCustomAttributes
Visualizzazione delle informazioni sul tipoViewing Type Information
Security Considerations for Reflection (Considerazioni sulla sicurezza per reflection)Security Considerations for Reflection