Levée de l'ambiguïté sur les cibles d'attribut (Guide de programmation C#)
Mise à jour : novembre 2007
Dans certains cas, la cible d'un attribut, à savoir l'entité à laquelle l'attribut s'applique, semble être ambiguë. Par exemple, dans la déclaration de méthode suivante, l'attribut SomeAttr peut s'appliquer à la méthode ou à la valeur de retour de la méthode :
public class SomeAttr : System.Attribute { }
[SomeAttr]
int Method()
{
return 0;
}
Ce genre de situation se rencontre fréquemment lors du marshaling. Pour lever cette ambiguïté, C# dispose d'un ensemble de cibles par défaut pour chaque type de déclaration, qu'il est possible de substituer en spécifiant de manière explicite les cibles des attributs.
// default: applies to method
[SomeAttr]
int Method1() { return 0; }
// applies to method
[method: SomeAttr]
int Method2() { return 0; }
// applies to return value
[return: SomeAttr]
int Method3() { return 0; }
Notez que cela est indépendant des cibles sur lesquelles SomeAttr est défini pour être valide ; c'est-à-dire que, même si SomeAttr a été défini pour s'appliquer uniquement aux valeurs de retour, la cible return devrait tout de même être spécifiée. En d'autres termes, le compilateur n'utilise pas les informations relatives à AttributeUsage pour lever l'ambiguïté des cibles des attributs. Pour plus d'informations, consultez AttributeUsage (Guide de programmation C#).
La syntaxe des cibles des attributs est la suivante :
[target : attribute-list]
Paramètres
target
L'une des cibles suivantes : assembly, field, event, method, module, param, property, return, type.attribute-list
Liste des attributs applicables.
Le tableau suivant répertorie toutes les déclarations dans lesquelles les attributs sont autorisés ; pour chaque déclaration, les cibles possibles des attributs dans la déclaration sont indiquées dans la deuxième colonne. Les cibles en gras correspondent aux valeurs par défaut.
Déclaration |
Cibles possibles |
---|---|
assembly |
assembly |
module |
module |
classe |
type |
struct |
type |
interface |
type |
enum |
type |
délégué |
type, return |
method |
method, return |
parameter |
param |
Champ |
field |
property — indexer |
property |
property — get accessor |
method, return |
property — set accessor |
method, param, return |
event — field |
event, field, method |
event — property |
event, property |
event — add |
method, param |
event — remove |
method, param |
L'assembly et les attributs de niveau de module n'ont aucune cible par défaut. Pour plus d'informations, consultez Attributs globaux.
Exemple
using System.Runtime.InteropServices;
[Guid("12345678-1234-1234-1234-123456789abc"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface ISampleInterface
{
[DispId(17)] // set the DISPID of the method
[return: MarshalAs(UnmanagedType.Interface)] // set the marshaling on the return type
object DoWork();
}
Voir aussi
Concepts
Référence
Réflexion (Guide de programmation C#)
Attributs (Guide de programmation C#)
Utilisation d'attributs (Guide de programmation C#)
Création d'attributs personnalisés (Guide de programmation C#)
Accès à des attributs à l'aide de la réflexion (Guide de programmation C#)