2012-04-27 12 views
5

kod Atrybutdziedziczone atrybuty

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class IgnoreAttribute : Attribute 
{ 
} 

Klasa bazowa

abstract class ManagementUnit 
{ 
    [Ignore] 
    public abstract byte UnitType { get; } 
} 

Główna klasa

class Region : ManagementUnit 
{ 
    public override byte UnitType 
    { 
     get { return 0; } 
    } 

    private static void Main() 
    { 
     Type t = typeof(Region); 
     foreach (PropertyInfo p in t.GetProperties()) 
     { 
      if (p.GetCustomAttributes(typeof(IgnoreAttribute), true).Length != 0) 
       Console.WriteLine("have attr"); 
      else 
       Console.WriteLine("don't have attr"); 
     } 
    } 
} 

Wyjście:don't have attr

Wyjaśnij, dlaczego tak się dzieje? W końcu musi to odziedziczyć.

Odpowiedz

5

Dziedziczna flaga określa, czy atrybut może być dziedziczony. Domyślną wartością tej wartości jest fałsz. Jeśli jednak odziedziczona flaga ma wartość ustawioną na wartość true, jej znaczenie zależy od wartości flagi AllowMultiple . Jeśli flaga odziedziczona ma wartość true, a flaga AllowMultiple ma wartość false, atrybut ten zastąpi atrybut dziedziczony. Jeśli jednak flaga dziedziczenia ma ustawioną wartość true, a flaga AllowMultiple ma także wartość true, atrybut ten jest gromadzony na elemencie.

z http://aclacl.brinkster.net/InsideC/32ch09f.htm Sprawdź rozdział Określanie Dziedziczenie Atrybut Zasady

EDIT: sprawdź Inheritance of Custom Attributes on Abstract Properties pierwsza odpowiedź:

To te GetCustomAttributes() metoda, która nie wygląda na rodzica deklaracji. Sprawdza tylko atrybuty zastosowane do określonego elementu .

+3

No, domyślny dla „odziedziczone” jest prawdziwe. https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.inherited(vsvs.110).aspx – 00jt

0

Flaga dziedziczenie w PropertyInfo.GetCustomAttributes jest ignorowany zarówno właściwości i zdarzeń co zostało udokumentowane przez: https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspx. Ale możesz użyć jednego z przeciążeń Attribute.GetCustomAttributes, aby włączyć dziedziczenie właściwości (lub zdarzeń).

Kwestia ta została omówiona bardziej szczegółowo w: http://blog.seancarpenter.net/2012/12/15/getcustomattributes-and-overridden-properties/

Powiązane problemy