À quoi se réfère la propriété Inherited
bool sur les attributs?
Cela signifie-t-il que si je définis ma classe avec un attribut AbcAtribute
(qui a Inherited = true
) et si j'hérite d'une autre classe de cette classe, la classe dérivée aura également le même attribut?
Pour clarifier cette question avec un exemple de code, imaginez ce qui suit:
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class Random: Attribute
{ /* attribute logic here */ }
[Random]
class Mother
{ }
class Child : Mother
{ }
Est-ce que Child
a également l'attribut Random
qui lui est appliqué?
Lorsque Inherited = true (valeur par défaut), cela signifie que l'attribut que vous créez peut être hérité par les sous-classes de la classe décorée par l'attribut.
Donc, si vous créez MyUberAttribute avec [AttributeUsage (Inherited = true)]
[AttributeUsage (Inherited = True)]
MyUberAttribute : Attribute
{
string _SpecialName;
public string SpecialName
{
get { return _SpecialName; }
set { _SpecialName = value; }
}
}
Ensuite, utilisez l'attribut en décorant une super classe ...
[MyUberAttribute(SpecialName = "Bob")]
class MySuperClass
{
public void DoInterestingStuf () { ... }
}
Si nous créons une sous-classe de MySuperClass, il aura cet attribut ...
class MySubClass : MySuperClass
{
...
}
Puis instancier une instance de MySubClass ...
MySubClass MySubClassInstance = new MySubClass();
Puis testez pour voir s'il a l'attribut ...
MySubClassInstance <--- a maintenant le MyUberAttribute avec "Bob" comme valeur SpecialName.
Oui c'est précisément ce que cela signifie. 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());
L'héritage d'attribut est activé par défaut.
Vous pouvez changer ce comportement en:
[AttributeUsage (Inherited = False)]