Tengo un atributo personalizado que quiero aplicar a mi base de la clase abstracta, de modo que puedo omitir elementos que no necesitan ser vistos por el usuario al mostrar el elemento en HTML. Parece que las propiedades de la invalidación de la clase base no se hereda los atributos.

Hace primordial de la base de propiedades (abstracto o virtual) golpe de distancia atributos colocados en el original de la propiedad?

De Atributo de la clase Defination

[AttributeUsage(AttributeTargets.Property,
                Inherited = true,
                AllowMultiple = false)]
public class NoHtmlOutput : Attribute
{
}

De La Clase Abstracta Defination

[NoHtmlOutput]
public abstract Guid UniqueID { get; set; }

De Hormigón De La Clase Defination

public override Guid UniqueID{ get{ return MasterId;} set{MasterId = value;}}

De la clase de cheques para el atributo

        Type t = o.GetType();
        foreach (PropertyInfo pi in t.GetProperties())
        {
            if (pi.GetCustomAttributes(typeof(NoHtmlOutput), true).Length == 1)
                continue;
            //processing logic goes here
        }

5 Comentarios

  1. 30

    No, son los atributos heredados.

    Es el GetCustomAttributes() método que no mira de los padres de declaraciones. Sólo se ve en los atributos aplicados para el miembro especificado. A partir de la documentación:

    Observaciones

    Este método ignora la heredan
    parámetro
    para eventos y propiedades.
    A la búsqueda de la cadena de la herencia para
    atributos de las propiedades y eventos
    el uso apropiado de las sobrecargas de los
    Atributo..::.GetCustomAttributes
    método.

    • La búsqueda de la Cadena, proporcionando la heredan parámetro pi.GetCustomAttributes(typeof(NoHtmlOutput), true)
    • Leer los comentarios. PropertyInfo.GetCustomAttributes() ignora la heredan parámetro.
    • No importa…. Microsoft tenía que ponerlo en el tipo más pequeño que se enfrentan a una posible
    • de la omi, eso es un extraño error, y extraños no es fijo hasta en .NET 4.5. Entonces, ¿por qué prever que bool sobrecarga a todos!!!!
    • Alguien a Eric Lippert en el teléfono y averiguar por qué esto es todavía un problema.
  2. 61

    Lugar de llamar a PropertyInfo.GetCustomAttributes(…), usted tiene que llamar al método estático del Sistema.Atributo.GetCustomAttributes(pi,…), como en:

    PropertyInfo info = GetType().GetProperties();
    
    //this gets only the attributes in the derived class and ignores the 'true' parameter
    object[] DerivedAttributes = info.GetCustomAttributes(typeof(MyAttribute),true);
    
    //this gets all of the attributes up the heirarchy
    object[] InheritedAttributes = System.Attribute.GetCustomAttributes(info,typeof(MyAttribute),true);
    • Esta debe ser la respuesta. Cambiando de mytype.GetCustomAttributes() a System.Attribute.GetCustomAttribute() hace que el inherit parámetro de trabajo como se supone que debe. La magia!
    • No me funciona en .NET 4.6.1. Tratando de obtener el atributo de la clase POCO de un Entity Framework dinámica de proxy (cuya base es la del tipo de clase POCO).
    • Tiene que ser un Atributo Personalizado. Algo así como DataMemberAttribute no se mostrarán.
    • es un atributo personalizado, como lo es cualquier otra cosa que se hereda de System.Attribute.
  3. 0

    Parece que sólo ocurre cuando el método de reemplazo también tiene el atributo .

    http://msdn.microsoft.com/en-us/library/a19191fh.aspx

    Sin embargo, puede modificar los atributos del mismo tipo o aplicar atributos adicionales a la derivada de la componente. El siguiente fragmento de código muestra un control personalizado que se reemplaza el Texto de la propiedad heredada de Control mediante la invalidación de la BrowsableAttribute atributo aplicado en la clase base.
    Visual Basic

    Public Class MyControl
       Inherits Control
       ' The base class has [Browsable(true)] applied to the Text property.
       <Browsable(False)>  _
       Public Overrides Property [Text]() As String
          ...
       End Property 
       ...
    End Class
  4. 0

    Aquí está mi intento. Este es un método de extensión en MemberInfo que manualmente se sube la jerarquía de herencia. Este parece ser compatible con proxies dinámicos…al menos manguera creado por el Castillo de todos modos así que estoy asumiendo que sería compatible con cualquier proxy de la biblioteca.

    public static IEnumerable<T> GetCustomAttributes<T>(this MemberInfo instance)
    {
        while (instance != null)
        {
            object[] attributes = instance.GetCustomAttributes(typeof(T), false);
            if (attributes.Length > 0)
            {
                return attributes.Cast<T>();
            }
            Type ancestor = instance.DeclaringType.BaseType;
            if (ancestor != null)
            {
                IEnumerable<MemberInfo> ancestormatches = ancestor.FindMembers(instance.MemberType, BindingFlags.Instance | BindingFlags.Public, 
                    (m, s) =>
                    {
                        return m.Name == (string)s;
                    }, instance.Name);
                instance = ancestormatches.FirstOrDefault();
            }
            else
            {
                instance = null;
            }
        }
        return new T[] { };
    }

    Y que podría utilizarlo como este.

    Type t = o.GetType();
    foreach (PropertyInfo pi in t.GetProperties())
    {
        IEnumerable<NoHtmlOutput> attributes = pi.GetCustomAttributes<NoHtmlOutput>();
        foreach (NoHtmlOutput attribute in attributes)
        {
          Console.WriteLine(attribute);
        }
    }
  5. 0

    Puede utilizar

    PropertyInfo::GetCustomAttributes<T>(true)

    que funciona correctamente, consulte el ejemplo:
    https://dotnetfiddle.net/2IhEWH

    así, no hay ninguna necesidad de utilizar el método estático

    System.Attribute.GetCustomAttributes

Dejar respuesta

Please enter your comment!
Please enter your name here