2012-04-27 12 views
5

código Atributoatributos heredados

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

Clase base

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

Clase principal

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

Salida:don't have attr

Explique por qué ocurre esto? Después de todo, debe ser heredado.

Respuesta

5

El indicador heredado dicta si el atributo se puede heredar. El valor predeterminado para este valor es falso. Sin embargo, si el indicador heredado es establecido en verdadero, su significado depende del valor del indicador AllowMultiple . Si el indicador heredado se establece en verdadero y el indicador AllowMultiple es falso, el atributo anulará el atributo heredado. Sin embargo, si el indicador heredado se establece en verdadero y el indicador AllowMultiple también se establece en verdadero, el atributo se acumula en el miembro.

de http://aclacl.brinkster.net/InsideC/32ch09f.htm Compruebe el capítulo Especificación de la herencia Atributo Reglas

EDITAR: check Inheritance of Custom Attributes on Abstract Properties La primera respuesta:

Es los GetCustomAttributes() que no se mira a los padres declaraciones. Solo mira los atributos aplicados al miembro especificado.

+3

No, el valor predeterminado para "heredado" es cierto. https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.inherited(v=vs.110).aspx – 00jt

Cuestiones relacionadas