¿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.