2009-08-06 18 views
82

Che cosa si riferisce alla proprietà bool di Inherited sugli attributi?Come funziona l'ereditarietà per gli attributi?

Vuol dire che se io definisco la mia classe con un attributo AbcAtribute (che ha Inherited = true), e se ho ereditato un'altra classe da quella classe, che la classe derivata avrà anche lo stesso attributo applicato ad esso?

Per chiarire la questione con un esempio di codice, immaginare la seguente:

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

[Random] 
class Mother 
{ } 

class Child : Mother 
{ } 

Vuol Child ha anche l'attributo Random applicato ad esso?

+0

Non è stato il caso quando hai fatto la domanda, ma oggi la [documentazione ufficiale della proprietà 'Inherited'] (https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.alherited. aspx) ha un esempio elaborato che mostra la differenza tra 'Inherited = true' e' Inherited = false' sia per una classe ereditata che per un metodo 'override'. –

risposta

88

Quando Inherited = true (che è il default), ciò significa che l'attributo si crea può essere ereditata da sottoclassi della classe decorata dall'attributo.

Quindi - se si crea MyUberAttribute con [AttributeUsage (ereditato = true)]

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

Poi usare l'attributo decorando un super-class ...

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

Se creiamo un sottoclasse di MySuperClass avrà questo attributo ...

class MySubClass : MySuperClass 
{ 
    ... 
} 

Quindi istanziare un istanc e di MySubClass ...

MySubClass MySubClassInstance = new MySubClass(); 

quindi verificare se ha l'attributo ...

MySubClassInstance < --- ha ora la MyUberAttribute con "Bob" come valore SpecialName.

+12

Si noti che l'ereditarietà degli attributi è abilitata per impostazione predefinita. –

12

Sì, questo è esattamente ciò che 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()); 
Problemi correlati