2011-09-05 13 views
60

Tengo clase y propiedades allí. Algunas propiedades se pueden marcar como atributo (es mi LocalizedDisplayName hereda de DisplayNameAttribute). Este es el método para obtener todas las propiedades de la clase:Obtener todas las propiedades que marcaron cierto atributo

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

Quiero añadir propiedades de clase en el cuadro de lista que marcó LocalizedDisplayName y valor de indicación de atributo en el cuadro de lista. ¿Cómo puedo hacer esto?

EDITAR
Esta 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 llegar cadena de archivo de recursos. Gracias.

+0

¿Qué es "valor de atributo"? Los atributos son clases, y podrían tener un * lote * de "valores" (propiedades/campos). ¿Tal vez 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 quiere de ella? –

+1

posible duplicado de [¿Cómo obtener una lista de propiedades con un atributo dado?] (Http://stackoverflow.com/questions/2281972/how-to-get-a-list-of-properties-with-a-given -attribute) – abatishchev

Respuesta

98

Es probable que sea más fácil de usar IsDefined:

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

EDIT: Para obtener los valores en sí, tendrá que utilizar:

var attributes = (LocalizedDisplayNameAttribute[]) 
     prop.GetCustomAttributes(typeof(LocalizedDisplayNameAttribute), false); 
+1

+1; Nit-pick: especificaría 'IEnumerable ' aquí :) Útil si la persona que ve esta respuesta no está familiarizada con Linq o Reflections. –

Cuestiones relacionadas