Pobierz wszystkie właściwości, które oznaczały określony atrybut

80

Mam tam klasę i właściwości. Niektóre właściwości można oznaczyć atrybutem (to moje LocalizedDisplayNamedziedzictwo DisplayNameAttribute). Oto metoda na pobranie wszystkich właściwości klasy:

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 oznaczono LocalizedDisplayNamei wyświetlić wartość atrybutu w polu listy. Jak mogę to zrobić?

EDYTUJ
To jest 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.

user348173
źródło
Co to jest „wartość atrybutu”? Atrybuty są klasami i mogą mieć wiele „wartości” (właściwości / pól). Może mówisz o wyniku z ToString()? Czy możesz edytować swoje pytanie, aby dodać kod dla stosowanych przez Ciebie atrybutów niestandardowych i określić, które dane chcesz z niego wyłączyć?
Merlyn Morgan-Graham,

Odpowiedzi:

132

Prawdopodobnie najłatwiejszy w użyciu IsDefined:

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

Aby uzyskać same wartości, użyjesz:

var attributes = (LocalizedDisplayNameAttribute[]) 
      prop.GetCustomAttributes(typeof(LocalizedDisplayNameAttribute), false);
Jon Skeet
źródło
7
+1; Nit-pick: sprecyzowałbym IEnumerable<PropertyInfo>tutaj :) Przydatne, jeśli osoba widząca tę odpowiedź nie jest zaznajomiona z Linq lub Reflections.
Merlyn Morgan-Graham,