Як працює спадкування для атрибутів?


108

До чого 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атрибут застосований до нього?


3
Це був не той випадок , коли ви поставили запитання, але сьогодні офіційна документація Inheritedвласності має складний приклад , який показує різницю між Inherited=trueі Inherited=falseяк для успадкованого класу і overrideметоди.
Jeppe Stig Nielsen

Відповіді:


117

Коли Успадковано = 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 () { ... }
}

Якщо ми створимо підклас MySuperClass, він буде мати цей атрибут ...

class MySubClass : MySuperClass
{
   ...
}

Потім примірник екземпляра MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Потім перевірити, чи є у нього атрибут ...

MySubClassInstance <--- тепер має MyUberAttribute з "Bob" як значення SpecialName.


21
Зверніть увагу, що успадкування атрибутів увімкнено за замовчуванням.
Корстіан Бурман

14

Так, саме це означає. Атрибут

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

2

Успадкування атрибутів увімкнено за замовчуванням.

Ви можете змінити таку поведінку:

[AttributeUsage (Inherited = False)]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.