2011-09-05 13 views
60

Mam tam klasę i właściwości. Niektóre właściwości mogą być oznaczone atrybutem (to mój LocalizedDisplayName dziedziczy po DisplayNameAttribute). Jest to metoda uzyskać wszystkie właściwości klasy:Pobierz wszystkie właściwości, które oznaczyły określony atrybut.

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

chcę dodać właściwości klasy w polu listy, które oznaczone LocalizedDisplayName i wyświetlaną wartość atrybutu w polu listy. Jak mogę to zrobić?

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

chcę uzyskać ciąg z pliku zasobów. Dzięki.

+0

Co to jest "wartość atrybutu"? Atrybuty są klasami i mogą mieć * lot * "wartości" (właściwości/pola). Może mówisz o wyniku z 'ToString()'? Czy możesz edytować pytanie, aby dodać kod dla niestandardowych atrybutów, które stosujesz, i określić, które dane chcesz wyłączyć? –

+1

możliwy duplikat [Jak uzyskać listę właściwości z danym atrybutem?] (Http://stackoverflow.com/questions/2281972/how-to-get-a-list-of-properties-with-a-given -atrybut) – abatishchev

Odpowiedz

98

To chyba najłatwiejsze w użyciu IsDefined:

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

EDIT: Aby uzyskać wartości siebie, można użyć:

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

+1; Nit-pick: Chciałbym podać 'IEnumerable ' tutaj :) Pomocne, jeśli osoba widząca tę odpowiedź nie jest zaznajomiona z Linq lub Reflections. –

Powiązane problemy