Что означает свойство Inherited
bool на атрибутах?
Означает ли это, что если я определяю свой класс с атрибутом AbcAtribute
(который имеет Inherited = true
), и если я наследую другой класс из этого класса, то производный класс будет также иметь тот же самый атрибут, применяемый к нему?
Чтобы прояснить этот вопрос с помощью примера кода, представьте себе следующее:
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class Random: Attribute
{ /* attribute logic here */ }
[Random]
class Mother
{ }
class Child : Mother
{ }
Использует ли Child
атрибут Random
?
Когда Inherited = true (по умолчанию), это означает, что создаваемый вами атрибут может быть унаследован подклассами класса, украшенного атрибутом.
Итак - если вы создаете MyUberAttribute с помощью [AttributeUsage (Inherited = true)]
[AttributeUsage (Inherited = True)]
MyUberAttribute : Attribute
{
string _SpecialName;
public string SpecialName
{
get { return _SpecialName; }
set { _SpecialName = value; }
}
}
Затем используйте атрибут, украсив суперкласс...
[MyUberAttribute(SpecialName = "Bob")]
class MySuperClass
{
public void DoInterestingStuf () { ... }
}
Если мы создадим подкласс MyuperClass, у него будет этот атрибут...
class MySubClass : MySuperClass
{
...
}
Затем создайте экземпляр MySubClass...
MySubClass MySubClassInstance = new MySubClass();
Затем проверьте, есть ли у него атрибут...
MySubClassInstance < --- теперь имеет атрибут MyUberAttribute с именем "Bob" как значение SpecialName.
Да, это именно то, что это значит. Атрибут
[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().First());
Inherited
содержит подробный пример, который показывает разницу междуInherited=true
иInherited=false
как для унаследованного класса, так и для методаoverride
.