PropertyInfo - GetProperties с атрибутами - PullRequest
8 голосов
/ 10 мая 2011

Я пытаюсь создать пользовательский атрибут для проектов веб-формы.

Я уже могу получить все свойства из своего класса, но теперь я не знаю, как их отфильтровать, и просто получаю свойства, которые имеют некоторый атрибут.

Например:

PropertyInfo[] fields = myClass.GetType().GetProperties();

Это вернет мне все свойства. Но как я могу просто вернуть свойства, используя атрибут, например, «testAttribute»?

Я уже искал об этом, но после нескольких попыток решить эту проблему, я решил спросить здесь.

Ответы [ 4 ]

23 голосов
/ 10 мая 2011

Использование Attribute.IsDefined:

PropertyInfo[] fields = myClass.GetType().GetProperties()
    .Where(x => Attribute.IsDefined(x, typeof(TestAttribute), false))
    .ToArray();
9 голосов
/ 10 мая 2011
fields.Where(pi => pi.GetCustomAttributes(typeof(TestAttribute), false).Length > 0)

См. документацию для GetCustomAttributes().

2 голосов
/ 31 июля 2013

Вы можете использовать

    .Any()

и упрощенное выражение

    fields.Where(x => x.GetCustomAttributes(typeof(TestAttribute), false).Any())
1 голос
/ 10 мая 2011

Возможно, вам нужен метод GetCustomAttributes для MemberInfo.Если вы ищете, например, TestAttribute, вы можете использовать:

foreach (var propInfo in fields) {
    if (propInfo.GetCustomAttributes(typeof(TestAttribute), false).Count() > 0) {
        // Do some stuff...
    }      
}

Или, если вам просто нужно получить их все:

var testAttributes = fields.Where(x => x.GetCustomAttributes(typeof(TestAttribute), false).Count() > 0);
...