2012-04-27 11 views
5

Attribut CodeGeerbte Attribute

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

Basisklasse

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

Hauptklasse

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"); 
     } 
    } 
} 

Ausgabe:don't have attr

Erkläre, warum das passiert? Immerhin muss es geerbt werden.

Antwort

5

Das geerbte Flag gibt an, ob das Attribut vererbt werden kann. Der Standardwert für diesen Wert ist false. Wenn das geerbte Flag jedoch auf true festgelegt ist, hängt seine Bedeutung vom Wert des Flags AllowMultiple ab. Wenn das geerbte Flag auf "true" gesetzt ist und das AllowMultiple-Flag den Wert false hat, überschreibt das Attribut das geerbte Attribut. Wenn das vererbte Flag jedoch auf "true" gesetzt ist und das Flag "AllowMultiple " ebenfalls auf "true" gesetzt ist, wird das Attribut auf dem Member akkumuliert.

von http://aclacl.brinkster.net/InsideC/32ch09f.htm überprüfen Sie im Kapitel Festlegen von Vererbung Attribut

Regeln bearbeiten: Check Inheritance of Custom Attributes on Abstract Properties Die erste Antwort:

Es ist das GetCustomAttributes() -Methode, die bei Eltern sehen nicht Erklärungen. Es werden nur Attribute betrachtet, die auf das angegebene Element angewendet wurden.

+3

Nein, der Standard für „geerbt“, ist wahr. https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.inherited(v=vs.110).aspx – 00jt

0

Die Vererbungsflag in PropertyInfo.GetCustomAttributes für beide Eigenschaften und Ereignisse ignoriert wie dokumentiert: https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspx. Sie können jedoch eine der Attribute.GetCustomAttributes-Überladungen verwenden, um die Vererbung von Eigenschaften (oder Ereignissen) zu aktivieren.

Dieses Problem wird in mehr Einzelheiten diskutiert in: http://blog.seancarpenter.net/2012/12/15/getcustomattributes-and-overridden-properties/