Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dopo che gli attributi sono stati associati agli elementi del programma, la reflection può essere usata per eseguire query sulla loro esistenza e sui relativi valori. .NET fornisce , MetadataLoadContextche è possibile usare per esaminare il codice che non può essere caricato per l'esecuzione.
MetadataLoadContext
Il codice caricato nel MetadataLoadContext contesto non può essere eseguito. Questo significa che non è possibile creare istanze di attributi personalizzati, poiché richiederebbe l'esecuzione dei loro costruttori. Per caricare ed esaminare gli attributi personalizzati nel MetadataLoadContext contesto, usare la CustomAttributeData classe . È possibile ottenere istanze di questa classe usando l'overload appropriato del metodo statico CustomAttributeData.GetCustomAttributes . Per altre informazioni, vedere Procedura: Esaminare il contenuto dell'assembly usando MetadataLoadContext.
Contesto di esecuzione
I metodi principali di reflection per interrogare gli attributi nel contesto di esecuzione sono MemberInfo.GetCustomAttributes e Attribute.GetCustomAttributes.
L'accessibilità di un attributo personalizzato viene verificata in relazione all'assembly in cui è collegato. Equivale a verificare se un metodo su un tipo nell'assembly in cui è associato l'attributo personalizzato può chiamare il costruttore dell'attributo personalizzato.
Metodi come Assembly.GetCustomAttributes(Boolean) controllano la visibilità e l'accessibilità dell'argomento di tipo. Solo il codice nell'assembly che contiene il tipo definito dall'utente può recuperare un attributo personalizzato di quel tipo usando GetCustomAttributes.
L'esempio C# seguente è un tipico modello di progettazione di attributi personalizzati. Illustra il modello di reflection dell'attributo personalizzato di runtime.
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 per il tipo di DescriptionAttribute attributo personalizzato pubblico collegato al GetLanguage metodo, esegue le azioni seguenti:
- Il runtime verifica che l'argomento
DescriptionAttributedel tipoType.GetCustomAttributes(Type type)sia pubblico e pertanto sia visibile e accessibile. - Il runtime verifica che il tipo
MyDescriptionAttributedefinito dall'utente derivato daDescriptionAttributesia visibile e accessibile all'interno dell'assembly System.Web.dll, in cui è collegato al metodoGetLanguage(). - Il runtime verifica che il costruttore di
MyDescriptionAttributesia visibile e accessibile all'interno dell'assembly System.Web.dll. - Il runtime chiama il costruttore di
MyDescriptionAttributecon i parametri dell'attributo personalizzato e restituisce il nuovo oggetto al chiamante.
Il modello di reflection dell'attributo personalizzato potrebbe esporre istanze di tipi definiti dall'utente fuori dall'assembly in cui quel tipo è definito. Ciò non è diverso dai membri della libreria di sistema di runtime che restituiscono istanze di tipi definiti dall'utente, ad esempio Type.GetMethods la restituzione di una matrice di RuntimeMethodInfo oggetti. Per impedire a un client di individuare informazioni su un tipo di attributo personalizzato definito dall'utente, definire i membri del tipo da non pubblicare.
Nell'esempio seguente viene illustrato il modo di base di usare la reflection per ottenere l'accesso agli attributi personalizzati.
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);
}
}
}
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