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

Guide de programmation C#

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#)

System.Reflection

Attribute