Получить все свойства, отмеченные определенным атрибутом

80

У меня есть класс и свойства. Некоторые свойства могут быть помечены атрибутом (это мое LocalizedDisplayNameнаследство от DisplayNameAttribute). Это метод получения всех свойств класса:

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

Я хочу добавить свойства класса в список, который помечает LocalizedDisplayNameи отображает значение атрибута в списке. Как я могу это сделать?

ИЗМЕНИТЬ
Это 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);
        }
    }  

Я хочу получить строку из файла ресурсов. Благодарю.

user348173
источник
Что такое «значение атрибута»? Атрибуты являются классами и могут иметь множество «значений» (свойств / полей). Может ты про результат от ToString()? Можете ли вы отредактировать свой вопрос, чтобы добавить код для настраиваемых атрибутов, которые вы применяете, и указать, какие данные вы хотите использовать?
Мерлин Морган-Грэм

Ответы:

132

Наверное, проще всего использовать IsDefined:

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

Чтобы получить сами значения, вы должны использовать:

var attributes = (LocalizedDisplayNameAttribute[]) 
      prop.GetCustomAttributes(typeof(LocalizedDisplayNameAttribute), false);
Джон Скит
источник
7
+1; Nit-pick: Я бы уточнил IEnumerable<PropertyInfo>здесь :) Полезно, если человек, видящий этот ответ, не знаком с Linq или Reflections.
Мерлин Морган-Грэм