Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Une fois que les attributs ont été associés à des éléments de programme, la réflexion peut être utilisée pour interroger leur existence et leurs valeurs. .NET fournit le MetadataLoadContextcode que vous pouvez utiliser pour examiner le code qui ne peut pas être chargé pour l’exécution.
MetadataLoadContext
Le code chargé dans le MetadataLoadContext contexte ne peut pas être exécuté. Cela signifie que les instances d’attributs personnalisés ne peuvent pas être créées, car cela nécessiterait l’exécution de leurs constructeurs. Pour charger et examiner des attributs personnalisés dans le MetadataLoadContext contexte, utilisez la CustomAttributeData classe. Vous pouvez obtenir des instances de cette classe à l’aide de la surcharge appropriée de la méthode statique CustomAttributeData.GetCustomAttributes . Pour plus d’informations, consultez Guide pratique pour inspecter le contenu de l’assembly à l’aide de MetadataLoadContext.
Contexte d’exécution
Les principales méthodes de réflexion pour interroger les attributs dans le contexte d’exécution sont MemberInfo.GetCustomAttributes et Attribute.GetCustomAttributes.
L’accessibilité d’un attribut personnalisé est vérifiée par rapport à l’assembly dans lequel il est attaché. Cela équivaut à vérifier si une méthode sur un type dans l’assembly dans lequel l’attribut personnalisé est attaché peut appeler le constructeur de l’attribut personnalisé.
Méthodes telles que Assembly.GetCustomAttributes(Boolean) vérifier la visibilité et l’accessibilité de l’argument de type. Seul le code dans l'assembly qui contient le type défini par l'utilisateur peut récupérer un attribut personnalisé de ce type à l'aide de GetCustomAttributes.
L’exemple C# suivant est un modèle de conception d’attribut personnalisé classique. Il illustre le modèle de réflexion des attributs personnalisés à l'exécution.
System.DLL
public class DescriptionAttribute : Attribute
{
}
System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}
public class LocalizationExtenderProvider
{
[MyDescriptionAttribute(...)]
public CultureInfo GetLanguage(...)
{
}
}
Si le runtime tente de récupérer les attributs personnalisés pour le type DescriptionAttribute d’attribut personnalisé public attaché à la GetLanguage méthode, il effectue les actions suivantes :
- Le runtime vérifie que l'argument de type
DescriptionAttributeàType.GetCustomAttributes(Type type)est public et, par conséquent, est visible et accessible. - Le runtime vérifie que le type défini par l'utilisateur
MyDescriptionAttribute, qui est dérivé deDescriptionAttribute, est visible et accessible dans l'assembly System.Web.dll, où il est attaché à la méthodeGetLanguage(). - Le runtime vérifie que le constructeur de
MyDescriptionAttributeest visible et accessible dans l’assembly System.Web.dll. - Le runtime appelle le constructeur de
MyDescriptionAttributeavec les paramètres de l'attribut personnalisé et retourne le nouvel objet à l’appelant.
Le modèle de réflexion d'attribut personnalisé peut exposer des instances de types définis par l'utilisateur en dehors de l'assembly dans lequel le type est défini. Cela n’est pas différent des membres de la bibliothèque du système d'exécution qui retournent des instances de types définis par l’utilisateur, tel que Type.GetMethods qui renvoie un tableau d'objets RuntimeMethodInfo. Pour empêcher un client de découvrir des informations sur un type d’attribut personnalisé défini par l’utilisateur, définissez les membres du type comme non publics.
L’exemple suivant illustre la façon de base d’utiliser la réflexion pour accéder aux attributs personnalisés.
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