PropertyInfo — получение свойств с атрибутами

#c# #system.reflection

#c# #system.reflection

Вопрос:

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

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

Например:

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

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

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

Ответ №1:

Использовать Attribute.IsDefined :

 PropertyInfo[] fields = myClass.GetType().GetProperties()
    .Where(x => Attribute.IsDefined(x, typeof(TestAttribute), false))
    .ToArray();
  

Комментарии:

1. Это лучший ответ: нет необходимости считать, когда нам просто нужна проверка существования.

Ответ №2:

 fields.Where(pi => pi.GetCustomAttributes(typeof(TestAttribute), false).Length > 0)
  

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

Комментарии:

1. Спасибо. Я пытался использовать GetCostumAttributes, но я не выполнял условие длины > 0. Ты решил это, приятель 😉

Ответ №3:

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

     .Any()
  

и упростить выражение

     fields.Where(x => x.GetCustomAttributes(typeof(TestAttribute), false).Any())
  

Ответ №4:

Вероятно, вам нужен метод 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);
  

Комментарии:

1. Используйте Any() вместо Count() > 0