Wie funktioniert die Vererbung für Attribute?

108

Worauf bezieht sich die Inheritedbool-Eigenschaft für Attribute?

Bedeutet dies, dass, wenn ich meine Klasse mit einem Attribut definiere AbcAtribute(das hat Inherited = true) und wenn ich eine andere Klasse von dieser Klasse erbe, auf die abgeleitete Klasse auch dasselbe Attribut angewendet wird?

Stellen Sie sich Folgendes vor, um diese Frage anhand eines Codebeispiels zu klären:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Hat Childauch das RandomAttribut darauf angewendet?

verschlungenes Elysium
quelle
2
Es war nicht der Fall, als Sie die Frage gestellt haben, aber heute enthält die offizielle Dokumentation der InheritedEigenschaft ein ausführliches Beispiel, das den Unterschied zwischen Inherited=trueund Inherited=falsesowohl für eine geerbte Klasse als auch für eine overrideMethode zeigt.
Jeppe Stig Nielsen

Antworten:

117

Wenn Inherited = true (dies ist die Standardeinstellung), bedeutet dies, dass das von Ihnen erstellte Attribut von Unterklassen der durch das Attribut dekorierten Klasse geerbt werden kann.

Also - wenn Sie MyUberAttribute mit [AttributeUsage (Inherited = true)] erstellen

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

Verwenden Sie dann das Attribut, indem Sie eine Superklasse dekorieren ...

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

Wenn wir eine Unterklasse von MySuperClass erstellen, hat diese dieses Attribut ...

class MySubClass : MySuperClass
{
   ...
}

Instanziieren Sie dann eine Instanz von MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Testen Sie dann, ob das Attribut vorhanden ist ...

MySubClassInstance <--- hat jetzt das MyUberAttribute mit "Bob" als SpecialName-Wert.

cmdematos.com
quelle
21
Bitte beachten Sie, dass die Attributvererbung standardmäßig aktiviert ist.
Corstian Boerman
14

Ja, genau das bedeutet es. 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
quelle
2

Die Attributvererbung ist standardmäßig aktiviert.

Sie können dieses Verhalten ändern, indem Sie:

[AttributeUsage (Inherited = False)]
Kolob Canyon
quelle