#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