Partager via


AttributeUsage (Guide de programmation C#)

Mise à jour : novembre 2007

Détermine comment utiliser une classe d'attributs personnalisée. AttributeUsage est un attribut qui peut être appliqué à des définitions d'attributs personnalisées pour contrôler la façon dont le nouvel attribut peut être appliqué. Voici à quoi ressemblent les paramètres par défaut lorsqu'ils sont appliqués explicitement :

[System.AttributeUsage(System.AttributeTargets.All, 
                   AllowMultiple=false, 
                   Inherited=true)]
class NewAttribute : System.Attribute { }

Dans cet exemple, la classe NewAttribute peut être appliquée à toute entité de code pouvant prendre des attributs, mais ne peut s'appliquer qu'une fois à chaque entité. Les classes dérivées en héritent dans le cas d'une classe de base.

Les arguments AllowMultiple et Inherited sont facultatifs, donc ce code a le même effet :

[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }

Le premier argument AttributeUsage doit être un ou plusieurs éléments de l'énumération AttributeTargets. Plusieurs types cibles peuvent être rassemblés dans une opération OR, de la manière suivante :

using System;
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }

Si l'argument AllowMultiple a la valeur true, l'attribut qui en résulte peut être appliqué plusieurs fois à une même entité, de la manière suivante :

using System;
[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
class MultiUseAttr : Attribute { }

[MultiUseAttr][MultiUseAttr]
class Class1 { }

[MultiUseAttr, MultiUseAttr]
class Class2 { }

Dans ce cas, MultiUseAttr peut être appliqué à plusieurs reprises parce que AllowMultiple a la valeur true. Les deux formats indiqués pour appliquer plusieurs attributs sont valides.

Si Inherited a la valeur false, les classes dérivées d'une classe attribuée n'héritent pas de l'attribut. Par exemple :

using System;
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
class Attr1 : Attribute { }

[Attr1]
class BClass { }

class DClass : BClass { }

Dans ce cas, Attr1 n'est pas appliqué à DClass par héritage.

Notes

L'attribut AttributeUsage est un attribut à utilisation unique--il ne peut pas s'appliquer plusieurs fois à la même classe. AttributeUsage est un alias de AttributeUsageAttribute.

Pour plus d'informations, consultez Accès à des attributs à l'aide de la réflexion (Guide de programmation C#).

Exemple

L'exemple suivant montre l'effet des arguments Inherited et AllowMultiple sur l'attribut AttributeUsage, et la façon dont les attributs personnalisés appliqués à une classe peuvent être énumérés.

using System;

// Create some custom attributes:
[AttributeUsage(System.AttributeTargets.Class, Inherited=false)]
class A1 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class)]
class A2 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class, AllowMultiple=true)]
class A3 : System.Attribute { }

// Apply custom attributes to classes:
[A1,A2]
class BaseClass { }

[A3,A3]
class DerivedClass : BaseClass { }

public class TestAttributeUsage
{
    static void Main()
    {
        BaseClass b = new BaseClass();
        DerivedClass d = new DerivedClass();

        // Display custom attributes for each class.
        Console.WriteLine("Attributes on Base Class:");
        object[] attrs = b.GetType().GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Console.WriteLine(attr);
        }
 
        Console.WriteLine("Attributes on Derived Class:");
        attrs = d.GetType().GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Console.WriteLine(attr);
        }
    }
}

Résultat de l'exemple

Attributes on Base Class:
A1
A2
Attributes on Derived Class:
A3
A3
A2

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

Levée de l'ambiguïté sur les cibles d'attribut (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#)

Attribute

System.Reflection