Como funciona a herança para atributos?

108

A que Inheritedse refere a propriedade bool nos atributos?

Isso significa que se eu definir minha classe com um atributo AbcAtribute(que tem Inherited = true), e se eu herdar outra classe dessa classe, que a classe derivada também terá o mesmo atributo aplicado a ela?

Para esclarecer essa questão com um exemplo de código, imagine o seguinte:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Será que Childtambém têm o Randomatributo aplicado a ele?

elísio devorado
fonte
3
Não era o caso quando você fez a pergunta, mas hoje a documentação oficial da Inheritedpropriedade tem um exemplo elaborado que mostra a diferença entre Inherited=truee Inherited=falsepara uma classe herdada e um overridemétodo.
Jeppe Stig Nielsen

Respostas:

117

Quando Inherited = true (que é o padrão), significa que o atributo que você está criando pode ser herdado por subclasses da classe decorada pelo atributo.

Então - se você criar MyUberAttribute com [AttributeUsage (Inherited = true)]

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

Em seguida, use o atributo decorando uma superclasse ...

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

Se criarmos uma subclasse de MySuperClass, ela terá este atributo ...

class MySubClass : MySuperClass
{
   ...
}

Em seguida, instancie uma instância de MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Em seguida, teste para ver se tem o atributo ...

MySubClassInstance <--- agora tem MyUberAttribute com "Bob" como o valor SpecialName.

cmdematos.com
fonte
21
Observe que a herança de atributos é habilitada por padrão.
Corstian Boerman
14

Sim, é exatamente isso que significa. Atributo

[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
fonte
2

A herança de atributos é habilitada por padrão.

Você pode alterar esse comportamento:

[AttributeUsage (Inherited = False)]
Kolob Canyon
fonte