113 votes

Comment fonctionne l'héritage pour les attributs?

Ce qui ne l' Inherited bool propriété sur les attributs se réfère à?

Ça veut dire que si je définir ma classe avec un attribut AbcAtribute ( Inherited = true), et si j'ai hériter d'une autre classe à partir de cette classe, que la classe dérivée aura également que le même attribut appliqué?

Afin de clarifier cette question avec un exemple de code, imaginez le suivant:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

N' Child ont également l' Random attribut appliqué?

125voto

cmdematos.com Points 871

Lorsque Hérité = true, cela signifie que l'attribut que vous créez peuvent être héritées par les sous-classes de la classe décorée par l'attribut.

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

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

Ensuite, utilisez l'Attribut par la décoration d'une super-classe...

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

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

class MySubClass : MySuperClass
{
   ...
}

Ensuite instancier une instance de MySubClass...

MySubClass MySubClassInstance = new MySubClass();

Puis testez pour voir si il a l'attribut...

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

14voto

ShuggyCoUk Points 24204

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

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