web-dev-qa-db-ja.com

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

属性のInherited boolプロパティは何を指しますか?

クラスを属性AbcAtributeInherited = true)、およびそのクラスから別のクラスを継承する場合、派生クラスにも同じ属性が適用されますか?

コード例を使用してこの質問を明確にするには、次のことを想像してください。

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

ChildにもRandom属性が適用されていますか?

103

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 <--- SpecialName値として「Bob」を含むMyUberAttributeが追加されました。

106
cmdematos.com

はい、それはまさにそれが意味するものです。 属性

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

属性の継承はデフォルトで有効になっています。

この動作は次の方法で変更できます。

[AttributeUsage (Inherited = False)]
1
Kolob Canyon