Bagaimana cara kerja pewarisan untuk Atribut?

108

Apa yang Inheriteddirujuk oleh properti bool pada atribut?

Apakah ini berarti bahwa jika saya mendefinisikan kelas saya dengan atribut AbcAtribute(yang memiliki Inherited = true), dan jika saya mewarisi kelas lain dari kelas itu, kelas turunan juga akan memiliki atribut yang sama yang diterapkan padanya?

Untuk memperjelas pertanyaan ini dengan contoh kode, bayangkan yang berikut ini:

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

[Random]
class Mother 
{ }

class Child : Mother 
{ }

Apakah Childjuga memiliki Randomatribut yang diterapkan padanya?

melahap elysium
sumber
3
Ini tidak terjadi ketika Anda mengajukan pertanyaan, tetapi hari ini dokumentasi resmi Inheritedproperti memiliki contoh terperinci yang menunjukkan perbedaan antara Inherited=truedan Inherited=falseuntuk kelas yang diwariskan dan overridemetode.
Jeppe Stig Nielsen

Jawaban:

117

Ketika Inherited = true (yang merupakan default) itu berarti bahwa atribut yang Anda buat dapat diwarisi oleh sub-kelas dari kelas yang didekorasi oleh atribut tersebut.

Jadi - jika Anda membuat MyUberAttribute dengan [AttributeUsage (Inherited = true)]

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

Kemudian gunakan Atribut dengan mendekorasi kelas super ...

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

Jika kita membuat sub-kelas MySuperClass, ia akan memiliki atribut ini ...

class MySubClass : MySuperClass
{
   ...
}

Kemudian buat instance MySubClass ...

MySubClass MySubClassInstance = new MySubClass();

Kemudian uji untuk melihat apakah itu memiliki atribut ...

MySubClassInstance <--- sekarang memiliki MyUberAttribute dengan "Bob" sebagai nilai SpecialName.

cmdematos.com
sumber
21
Harap dicatat bahwa pewarisan atribut diaktifkan secara default.
Corstian Boerman
14

Ya, itulah tepatnya yang dimaksud. Atribut

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

Pewarisan atribut diaktifkan secara default.

Anda dapat mengubah perilaku ini dengan:

[AttributeUsage (Inherited = False)]
Ngarai Kolob
sumber