2009-08-06 15 views
82

¿Qué la propiedad Inherited bool en atributos se refiere a?¿Cómo funciona la herencia para los atributos?

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

Para aclarar esta cuestión 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 
{ } 

¿Se Child también tienen el atributo Random que se le aplica?

+0

No fue el caso cuando hizo la pregunta, pero hoy la [documentación oficial de la propiedad 'Inherited'] (https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.herenciado). aspx) tiene un elaborado ejemplo que muestra la diferencia entre 'Heredado = verdadero' y 'Heredado = falso' tanto para una clase heredada como para un método 'anulado'. –

Respuesta

88

Cuando hereda = true (que es el valor por defecto) significa que el atributo que está creando puede ser heredada por las subclases de la clase decorada por el atributo.

Por lo tanto - si crea MyUberAttribute con [AttributeUsage (heredado = true)]

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

A continuación, utilizar el atributo mediante la decoración de una super-clase ...

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

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

class MySubClass : MySuperClass 
{ 
    ... 
} 

a continuación, una instancia de un instanc e de MySubClass ...

MySubClass MySubClassInstance = new MySubClass(); 

A continuación, prueba a ver si tiene el atributo ...

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

+12

Tenga en cuenta que la herencia de atributo está habilitada de forma predeterminada. –

12

Sí, eso es precisamente lo que significa. Attribute

[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()); 
Cuestiones relacionadas