2009-08-06 5 views
82

Worauf bezieht sich die Bool-Eigenschaft Inherited auf Attribute?Wie funktioniert die Vererbung für Attribute?

Bedeutet es, dass, wenn ich meine Klasse mit einem Attribut AbcAtribute (das hat Inherited = true) definieren, und wenn ich eine andere Klasse von dieser Klasse erben, dass die abgeleitete Klasse auch dasselbe Attribut angewendet haben wird?

Um diese Frage mit einem Codebeispiel zu verdeutlichen, stellen Sie wie folgt vor:

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

[Random] 
class Mother 
{ } 

class Child : Mother 
{ } 

Hat Child auch die Random auf sie angewendet Attribut?

+0

Es war nicht der Fall, als Sie die Frage gestellt haben, aber heute ist die [offizielle Dokumentation der Eigenschaft 'Inherited'] (https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.inherited. aspx) hat ein aufwendiges Beispiel, das den Unterschied zwischen "Inherited = true" und "Inherited = false" sowohl für eine geerbte Klasse als auch für eine "override" -Methode zeigt. –

Antwort

88

Wenn geerbt = true (die Standardeinstellung ist) bedeutet dies, dass das Attribut Sie können erstellen von Unterklassen der Klasse durch das Attribut dekoriert vererbt werden.

Also - wenn Sie MyUberAttribute mit [Attributeusage (Geerbt = true)]

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

dann das Attribut erstellen verwenden, indem Sie ein Super-Klasse Dekoration ...

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

Wenn wir ein erstellen Unterklasse von MySuperClass es wird dieses Attribut haben ...

class MySubClass : MySuperClass 
{ 
    ... 
} 

Dann instanziieren ein Instanc e von MySubClass ...

MySubClass MySubClassInstance = new MySubClass(); 

Dann ist es testen, ob das Attribut ...

<

MySubClassInstance hat --- hat nun die MyUberAttribute mit "Bob" als SpecialName Wert.

+12

Bitte beachten Sie, dass die Attributvererbung standardmäßig aktiviert ist. –

12

Ja das ist genau das, was es bedeutet. 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()); 
Verwandte Themen