Как наследование работает для атрибутов?

74

Что означает свойство 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?

  • 2
    Это был не тот случай, когда вы задавали вопрос, но сегодня официальная документация свойства Inherited содержит подробный пример, который показывает разницу между Inherited=true и Inherited=false как для унаследованного класса, так и для метода override .
Теги:
attributes

2 ответа

87
Лучший ответ

Когда 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.

  • 14
    Обратите внимание, что наследование атрибутов включено по умолчанию.
12

Да, это именно то, что это значит. Атрибут

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню