it-swarm.com.de

Wie funktioniert die Vererbung von Attributen?

Worauf bezieht sich die bool-Eigenschaft Inherited für Attribute? 

Bedeutet das, dass, wenn ich meine Klasse mit einem Attribut AbcAtribute definiere (das Inherited = true hat) und wenn ich eine andere Klasse von dieser Klasse erbe, diese abgeleitete Klasse auch dieses Attribut zugewiesen hat?

Um diese Frage anhand eines Codebeispiels zu klären, stellen Sie sich Folgendes vor:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Wird auf Child auch das Random-Attribut angewendet?

94

Wenn Inherited = true ist (was der Standardwert ist), bedeutet dies, dass das von Ihnen erstellte Attribut von Unterklassen der durch das Attribut eingerichteten Klasse geerbt werden kann.

Wenn Sie also MyUberAttribute mit [AttributeUsage (Inherited = true)] erstellen

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

Dann benutze das Attribut, indem du eine Superklasse dekorierst ...

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

Wenn wir eine Unterklasse von MySuperClass erstellen, wird sie dieses Attribut haben ...

class MySubClass : MySuperClass
{
   ...
}

Dann instanziieren Sie eine Instanz von MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Dann testen Sie, ob es das Attribut hat ...

MySubClassInstance <--- hat jetzt das MyUberAttribute mit "Bob" als Wert für SpecialName.

98
cmdematos.com

Ja, genau das bedeutet es. Attribut

[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());
13
ShuggyCoUk

Die Vererbung von Attributen ist standardmäßig aktiviert. 

Sie können dieses Verhalten folgendermaßen ändern:

[AttributeUsage (Inherited = False)]
0
Kolob Canyon