¿Cómo funciona la herencia para los atributos?


108

¿A qué se refiere la Inheritedpropiedad bool sobre atributos?

¿Significa que si defino mi clase con un atributo AbcAtribute(que tiene Inherited = true), y si heredo otra clase de esa clase, la clase derivada también tendrá ese mismo atributo aplicado?

Para aclarar esta pregunta con un ejemplo de código, imagina lo siguiente:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

¿ ChildTambién se le ha Randomaplicado el atributo?


3
No era el caso cuando hiciste la pregunta, pero hoy la documentación oficial de la Inheritedpropiedad tiene un ejemplo elaborado que muestra la diferencia entre Inherited=truey Inherited=falsepara una clase heredada y un overridemétodo.
— Jeppe Stig Nielsen

Respuestas:


117

Cuando Inherited = true (que es el valor predeterminado) significa que el atributo que está creando puede ser heredado por subclases de la clase decorada por el atributo.

Entonces, si crea MyUberAttribute con [AttributeUsage (Inherited = true)]

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

Luego usa el atributo decorando una superclase ...

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

Si creamos una subclase de MySuperClass, tendrá este atributo ...

class MySubClass : MySuperClass
{
   ...
}

Luego, cree una instancia de MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Luego prueba para ver si tiene el atributo ...

MySubClassInstance <--- ahora tiene MyUberAttribute con "Bob" como valor SpecialName.


21
Tenga en cuenta que la herencia de atributos está habilitada de forma predeterminada.
— Corstian Boerman

14

Sí, eso es precisamente lo 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());

2

La herencia de atributos está habilitada de forma predeterminada.

Puede cambiar este comportamiento de la siguiente manera:

[AttributeUsage (Inherited = False)]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.