Как наследование работает для атрибутов? - PullRequest
101 голосов
/ 06 августа 2009

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

105 голосов
/ 07 августа 2009

Когда 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 () { ... }
}

Если мы создадим подкласс MySuperClass, он будет иметь этот атрибут ...

class MySubClass : MySuperClass
{
   ...
}

Затем создать экземпляр MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Затем проверьте, имеет ли он атрибут ...

MySubClassInstance <--- теперь имеет MyUberAttribute со значением "Bob" в качестве значения SpecialName. </p>

14 голосов
/ 06 августа 2009

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

[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());
1 голос
/ 01 ноября 2018

Наследование атрибутов включено по умолчанию.

Вы можете изменить это поведение:

[AttributeUsage (Inherited = False)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...