У меня есть тип, t
и я хотел бы получить список открытых свойств, которые имеют атрибут MyAttribute
. Атрибут помечен AllowMultiple = false
, как это:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
В настоящее время у меня есть это, но я думаю, что есть лучший способ:
foreach (PropertyInfo prop in t.GetProperties())
{
object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
if (attributes.Length == 1)
{
//Property with my custom attribute
}
}
Как я могу улучшить это? Приношу свои извинения, если это дубликат, есть множество тем для размышлений ... кажется, что это очень горячая тема.
c#
.net
reflection
wsanville
источник
источник
Ответы:
Это позволяет избежать материализации любых экземпляров атрибута (т.е. это дешевле, чем
GetCustomAttribute[s]()
.источник
get
не вызывается даже при использованииGetCustomAttributes
; однако атрибут создается , что не является бесплатным. Если вам не нужно проверять конкретные значения атрибута,IsDefined
это дешевле. И в 4.5 есть способы проверить данные экземпляров без фактического создания каких-либо экземпляров атрибутов (хотя это предназначено только для очень специфических сценариев)Решение, которое я использую чаще всего, основано на ответе Томаса Петричека. Обычно я хочу сделать что - то с как атрибута и свойства.
источник
Насколько я знаю, лучшего способа работы с библиотекой Reflection не существует. Тем не менее, вы можете использовать LINQ, чтобы сделать код немного лучше:
Я считаю, что это поможет вам структурировать код более читабельным образом.
источник
Там всегда LINQ:
источник
Если вы регулярно имеете дело с Атрибутами в Reflection, очень и очень практично определить некоторые методы расширения. Вы увидите это во многих проектах. Вот этот, который я часто имею:
который вы можете использовать как
typeof(Foo).HasAttribute<BarAttribute>();
Другие проекты (например, StructureMap) имеют полноценные классы ReflectionHelper, которые используют деревья выражений для точного синтаксиса идентификации, например PropertyInfos. Использование тогда выглядит так:
источник
В дополнение к предыдущим ответам: лучше использовать метод,
Any()
а не проверять длину коллекции:Пример в dotnetfiddle: https://dotnetfiddle.net/96mKep
источник
.Any()
, не проверяет длину. Но мой ответ был не о найденных свойствах с одним атрибутом. Во-вторых, я не уверен, что вы правильно прочитали код -.Any
метод вызывается по результатуGetCustomAttrubutes
метода. Таким образом, типомpropertiesWithMyAttribute
будет коллекция свойств. Посмотрите пример на dotnetfiddle (я добавляю ссылку на ответ).