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

elisio devorado
fuente
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.

cmdematos.com
fuente
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());
ShuggyCoUk
fuente
2

La herencia de atributos está habilitada de forma predeterminada.

Puede cambiar este comportamiento de la siguiente manera:

[AttributeUsage (Inherited = False)]
Cañón de Kolob
fuente