Attribute

De Banane Atomic
Aller à la navigationAller à la recherche

Héritage

Les classes héritent des attributs de leurs classes parentes mais pas de leurs interfaces.

Création d'un attribut

Csharp.svg
// classe publique
// cet attribut s'applique aux propriétés
// AllowMultiple: l'attribut peut être déclaré plusieurs fois
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class MyAttribute : Attribute 
{
    // au moins un constructeur publique
    public MyAttribute(string positionalParameter)
    {
        PositionalParameter = positionalParameter;
    }

    // positional parameter: argument du constructeur
    public readonly string PositionalParameter;

    // named parameter: optionnel
    public string NamedParameter { get; private set; }
}

// utilisation
class MaClasse
{
    [My("paramètre")] // PositionalParameter = "paramètre"
    public string MaPropriété { get; set; }
}
By convention, all attribute names end with the word "Attribute"

Cible: AttributeTargets

Définit à quelle entité s'applique l'attribut

Csharp.svg
[AttributeUsage(AttributeTargets.Property)]
public class MyAttribute : Attribute 
{}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class MyAttribute : Attribute 
{}
  • All
  • Class
  • Method
  • Property

Types de paramètres autorisés

Pas de types custom et pas de délégués.

Accéder aux attributs par réflexion

Csharp.svg
// récupérer un type d'attribut sur une classe
var myAttribute = (MyAttribute)Attribute.GetCustomAttribute(typeof(MyClass), typeof(MyAttribute), false);

// récupérer tous les attributs d'un type sur une classe
var myAttributes = (MyAttribute[])Attribute.GetCustomAttributes(typeof(MyClass), typeof(MyAttribute), false);

// récupérer un type d'attribut sur une propriété
var myAttribute = (MyAttribute)Attribute.GetCustomAttribute(propertyInfo, typeof(MyAttribute), false);