Come funziona l'ereditarietà per gli attributi?


108

A cosa si Inheritedriferisce la proprietà bool sugli attributi?

Significa che se definisco la mia classe con un attributo AbcAtribute(che ha Inherited = true), e se eredito un'altra classe da quella classe, anche la classe derivata avrà lo stesso attributo applicato?

Per chiarire questa domanda con un esempio di codice, immagina quanto segue:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Fa Childanche Randoml'attributo applicato ad esso?


3
Non era il caso quando hai posto la domanda, ma oggi la documentazione ufficiale della Inheritedproprietà ha un esempio elaborato che mostra la differenza tra Inherited=truee Inherited=falsesia per una classe ereditata che per un overridemetodo.
Jeppe Stig Nielsen

Risposte:


117

Quando Inherited = true (che è l'impostazione predefinita) significa che l'attributo che stai creando può essere ereditato dalle sottoclassi della classe decorata dall'attributo.

Quindi, se crei MyUberAttribute con [AttributeUsage (Inherited = true)]

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

Quindi usa l'attributo decorando una super classe ...

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

Se creiamo una sottoclasse di MySuperClass avrà questo attributo ...

class MySubClass : MySuperClass
{
   ...
}

Quindi creare un'istanza di MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Quindi prova per vedere se ha l'attributo ...

MySubClassInstance <--- ora ha MyUberAttribute con "Bob" come valore SpecialName.


21
Tieni presente che l'ereditarietà degli attributi è abilitata per impostazione predefinita.
Corstian Boerman,

14

Sì, è proprio quello che significa. Attributo

[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'ereditarietà degli attributi è abilitata per impostazione predefinita.

Puoi modificare questo comportamento:

[AttributeUsage (Inherited = False)]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.