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é?


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.


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());

2

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

Vous pouvez modifier ce comportement en:

[AttributeUsage (Inherited = False)]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.