Comment fonctionne l'héritage pour les attributs?

108

À quoi fait Inheritedréférence la propriété booléenne sur les attributs?

Cela signifie-t-il que si je définis ma classe avec un attribut AbcAtribute(qui a Inherited = true), et si j'hérite d'une autre classe de cette classe, que la classe dérivée aura également le même attribut appliqué?

Pour clarifier cette question avec un exemple de code, imaginez ce qui suit:

[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class Random: Attribute
{ /* attribute logic here */ }

[Random]
class Mother 
{ }

class Child : Mother 
{ }

L' attribut Childlui est- il également Randomappliqué?

dévoré d'elysium
la source
3
Ce n'était pas le cas lorsque vous avez posé la question, mais aujourd'hui, la documentation officielle de la Inheritedpropriété a un exemple élaboré qui montre la différence entre Inherited=trueet Inherited=falsepour une classe héritée et une overrideméthode.
Jeppe Stig Nielsen

Réponses:

117

Lorsque Inherited = true (qui est la valeur par défaut), cela signifie que l'attribut que vous créez peut être hérité par des sous-classes de la classe décorée par l'attribut.

Donc, si vous créez MyUberAttribute avec [AttributeUsage (Inherited = true)]

[AttributeUsage (Inherited = True)]
MyUberAttribute : Attribute
{
   string _SpecialName;
   public string SpecialName
   { 
     get { return _SpecialName; }
     set { _SpecialName = value; }
   }
}

Ensuite, utilisez l'attribut en décorant une super-classe ...

[MyUberAttribute(SpecialName = "Bob")]
class MySuperClass 
{
  public void DoInterestingStuf () { ... }
}

Si nous créons une sous-classe de MySuperClass, elle aura cet attribut ...

class MySubClass : MySuperClass
{
   ...
}

Puis instanciez une instance de MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Ensuite, testez pour voir s'il a l'attribut ...

MySubClassInstance <--- a maintenant MyUberAttribute avec "Bob" comme valeur SpecialName.

cmdematos.com
la source
21
Veuillez noter que l'héritage d'attribut est activé par défaut.
Corstian Boerman
14

Oui, c'est précisément ce que cela signifie. Attribut

[AttributeUsage(Inherited=true)]
public class FooAttribute : System.Attribute
{
    private string name;

    public FooAttribute(string name)
    {
        this.name = name;
    }

    public override string ToString() { return this.name; }
}

[Foo("hello")]
public class BaseClass {}

public class SubClass : BaseClass {}

// outputs "hello"
Console.WriteLine(typeof(SubClass).GetCustomAttributes(true).First());
ShuggyCoUk
la source
2

L'héritage d'attribut est activé par défaut.

Vous pouvez modifier ce comportement en:

[AttributeUsage (Inherited = False)]
Canyon de Kolob
la source