属性の継承はどのように機能しますか?


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=falseoverride
Jeppe Stig Nielsen

回答:


117

Inherited = true(デフォルト)の場合、作成している属性は、属性によって装飾されたクラスのサブクラスによって継承できることを意味します。

したがって、[AttributeUsage(Inherited = true)]でMyUberAttributeを作成した場合

[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 <---には、 "Bob"をSpecialName値として持つMyUberAttributeが含まれるようになりました。


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)]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.