Jak działa dziedziczenie w przypadku atrybutów?

108

Do czego odnosi się Inheritedwłaściwość bool atrybutów?

Czy to oznacza, że ​​jeśli zdefiniuję swoją klasę za pomocą atrybutu AbcAtribute(który ma Inherited = true) i jeśli odziedziczę inną klasę z tej klasy, to do klasy pochodnej zostanie zastosowany ten sam atrybut?

Aby wyjaśnić to pytanie za pomocą przykładu kodu, wyobraź sobie, co następuje:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Czy Childma również Randomzastosowany atrybut?

pożarł elizjum
źródło
3
Nie było tak, gdy zadałeś to pytanie, ale dzisiaj oficjalna dokumentacja Inheritedmajątku zawiera rozbudowany przykład, który pokazuje różnicę między Inherited=truei Inherited=falsedla odziedziczonej klasy i overridemetody.
Jeppe Stig Nielsen

Odpowiedzi:

117

Gdy Inherited = true (co jest wartością domyślną), oznacza to, że tworzony atrybut może być dziedziczony przez podklasy klasy dekorowanej przez atrybut.

A więc - jeśli utworzysz MyUberAttribute z [AttributeUsage (Inherited = true)]

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

Następnie użyj Atrybutu, dekorując superklasę ...

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

Jeśli utworzymy podklasę MySuperClass, będzie ona miała ten atrybut ...

class MySubClass : MySuperClass
{
   ...
}

Następnie utwórz wystąpienie MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Następnie sprawdź, czy ma atrybut ...

MySubClassInstance <--- ma teraz MyUberAttribute z „Bob” jako wartością SpecialName.

cmdematos.com
źródło
21
Należy pamiętać, że dziedziczenie atrybutów jest domyślnie włączone.
Corstian Boerman
14

Tak, właśnie to oznacza. Atrybut

[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
źródło
2

Dziedziczenie atrybutów jest domyślnie włączone.

Możesz zmienić to zachowanie poprzez:

[AttributeUsage (Inherited = False)]
Kolob Canyon
źródło