4 votes

L'héritage d'attributs en C# ne fonctionne pas comme prévu

J'ai une propriété dans une classe de base avec quelques attributs :

[MyAttribute1]
[MyAttribute2]
public virtual int Count
{
  get
  {
    // some logic here
  }
  set
  {
    // some logic here
  }
}

C'est ce que j'ai fait dans une classe dérivée, parce que je veux ajouter MonAttribut3 à la propriété et que je ne peux pas modifier la classe de base :

[MyAttribute3]
public override int Count
{
  get
  {
     return base.Count;
  }
  set
  {
     base.Count = value;
  }

}

Cependant, la propriété se comporte maintenant comme si elle n'avait pas MyAttribute1 et MyAttribute2. Est-ce que je fais quelque chose de mal, ou est-ce que les attributs n'héritent pas ?

10voto

Lee Points 63849

Les attributs ne sont pas hérités par défaut. Vous pouvez le spécifier à l'aide de l'option AttributeUsage attribut :

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
public class MyAttribute : Attribute
{
}

2voto

Andy Points 3848

Cela semble fonctionner correctement pour moi, si vous utilisez simplement la méthode .GetType().GetCustomAttributes(true), cela ne renvoie en fait aucun attribut, même si vous mettez Inherited=true.

[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = true)]
sealed class MyAttribute : Attribute
{
    public MyAttribute()
    {
    }
}

[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = true)]
sealed class MyAttribute1 : Attribute
{
    public MyAttribute1()
    {
    }
}

class Class1
{
    [MyAttribute()]
    public virtual string test { get; set; }
}

class Class2 : Class1
{
    [MyAttribute1()]
    public override string test
    {
        get { return base.test; }
        set { base.test = value; }
    }
}

Puis récupérer les attributs personnalisés de la classe 2.

Class2 a = new Class2();

MemberInfo memberInfo = typeof(Class2).GetMember("test")[0];
object[] attributes = Attribute.GetCustomAttributes(memberInfo, true);

montre 2 éléments dans le tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X