2011-09-05 8 views
60

Ho classe e proprietà in là. Alcune proprietà possono essere contrassegnate come attribute (è la mia LocalizedDisplayName eredita da DisplayNameAttribute). Questo è il metodo per ottenere tutte le proprietà di classe:Ottieni tutte le proprietà che hanno contrassegnato determinati attributi

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

voglio aggiungere le proprietà della classe nella casella di riepilogo che ha segnato LocalizedDisplayName e visualizzazione valore dell'attributo nella casella di riepilogo. Come posso fare questo?

EDIT
Questo è 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); 
     } 
    } 

voglio ottenere stringa dal file di risorse. Grazie.

+0

Che cosa è "valore dell'attributo"? Gli attributi sono classi e potrebbero avere un * lotto * di "valori" (proprietà/campi). Forse stai parlando del risultato di 'ToString()'? Puoi modificare la tua domanda per aggiungere del codice per gli attributi personalizzati che stai applicando e specificare quali dati desideri disattivare? –

+1

possibile duplicato di [Come ottenere un elenco di proprietà con un determinato attributo?] (Http://stackoverflow.com/questions/2281972/how-to-get-a-list-of-properties-with-a-given -attributo) – abatishchev

risposta

98

E 'probabilmente più facile usare IsDefined:

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

EDIT: Per ottenere i valori stessi, utilizza:

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

+1; Nit-pick: vorrei specificare 'IEnumerable ' qui :) Utile se la persona che vede questa risposta non ha familiarità con Linq o Reflections. –

Problemi correlati