继承如何作用于属性?


108

Inherited属性的bool属性指的是什么?

这是否意味着如果我使用属性定义了我的类AbcAtribute(具有Inherited = true),并且从该类继承了另一个类,则派生类也将具有相同的属性?

为了用一个代码示例来阐明这个问题,请想象以下内容:

[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class Random: Attribute
{ /* attribute logic here */ }

[Random]
class Mother 
{ }

class Child : Mother 
{ }

是否ChildRandom应用了属性?


3
这是不是这样的,当你问的问题,但今天的官方文档Inherited属性有一个精心制作的例子,显示之间的差异Inherited=true,并Inherited=false为双方继承的类和override方法。
杰普·斯蒂格·尼尔森

Answers:


117

如果Inherited = true(默认值),则意味着您正在创建的属性可以被该属性装饰的类的子类继承。

所以-如果您使用[AttributeUsage(Inherited = true)]创建MyUberAttribute

[AttributeUsage (Inherited = True)]
MyUberAttribute : Attribute
{
   string _SpecialName;
   public string SpecialName
   { 
     get { return _SpecialName; }
     set { _SpecialName = value; }
   }
}

然后通过装饰超类来使用Attribute ...

[MyUberAttribute(SpecialName = "Bob")]
class MySuperClass 
{
  public void DoInterestingStuf () { ... }
}

如果我们创建MySuperClass的子类,它将具有此属性...

class MySubClass : MySuperClass
{
   ...
}

然后实例化MySubClass的实例...

MySubClass MySubClassInstance = new MySubClass();

然后测试是否具有属性...

MySubClassInstance <---现在具有MyUberAttribute,并将“ Bob”作为SpecialName值。


21
请注意,默认情况下启用属性继承。
Corstian Boerman,2015年

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)]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.