Obtener todas las propiedades que marcaron cierto atributo

80

Tengo clase y propiedades ahí. Algunas propiedades se pueden marcar como atributo (es mi LocalizedDisplayNameherencia DisplayNameAttribute). Este es el método para obtener todas las propiedades de la clase:

private void FillAttribute()
{
    Type type = typeof (NormDoc);
    PropertyInfo[] propertyInfos = type.GetProperties();
    foreach (var propertyInfo in propertyInfos)
    {
        ...
    }
}

Quiero agregar propiedades de clase en el cuadro de lista que marcó LocalizedDisplayNamey muestra el valor del atributo en el cuadro de lista. ¿Cómo puedo hacer esto?

EDITAR
Esto es LocalizedDisplayNameAttribute:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
    {
        public LocalizedDisplayNameAttribute(string resourceId)
            : base(GetMessageFromResource(resourceId))
        { }

        private static string GetMessageFromResource(string resourceId)
        {
            var test =Thread.CurrentThread.CurrentCulture;
            ResourceManager manager = new ResourceManager("EArchive.Data.Resources.DataResource", Assembly.GetExecutingAssembly());
            return manager.GetString(resourceId);
        }
    }  

Quiero obtener una cadena del archivo de recursos. Gracias.

user348173
fuente
¿Qué es "valor de atributo"? Los atributos son clases y pueden tener muchos "valores" (propiedades / campos). ¿Quizás estás hablando del resultado de ToString()? ¿Puede editar su pregunta para agregar algún código para los atributos personalizados que está aplicando y especificar qué datos desea obtener?
Merlyn Morgan-Graham

Respuestas:

132

Probablemente sea más fácil de usar IsDefined:

var properties = type.GetProperties()
    .Where(prop => prop.IsDefined(typeof(LocalizedDisplayNameAttribute), false));

Para obtener los valores en sí mismos, usaría:

var attributes = (LocalizedDisplayNameAttribute[]) 
      prop.GetCustomAttributes(typeof(LocalizedDisplayNameAttribute), false);
Jon Skeet
fuente
7
+1; Nit-pick: Lo especificaría IEnumerable<PropertyInfo>aquí :) Útil si la persona que ve esta respuesta no está familiarizada con Linq o Reflections.
Merlyn Morgan-Graham