Оптимизация отражений с атрибутами.
-
05-07-2019 - |
Вопрос
Есть ли способ в C #:
<Ол>Получить все свойства класса, которые имеют атрибуты (вместо того, чтобы обходить все свойства и затем проверять, существует ли атрибут.
Если мне нужны все свойства Public, Internal и Protected, но НЕ private, я не могу найти способ сделать это. Я могу сделать только это:
PropertyInfo [] props = type.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
Есть ли способ избежать частной собственности, но получить все остальное.
Решение
Я не верю, что есть способ сделать что-то из этого.
Сколько же типов вы должны обдумать? Это действительно узкое место? Вы можете кэшировать результаты, чтобы избежать необходимости делать это более одного раза для каждого типа?
Другие советы
Что касается кеширования: если вы обращаетесь к свойствам через TypeDescriptor.GetProperties
, то вы получаете кеширование бесплатно. Класс TypeDescriptor
имеет несколько других полезных служебных методов для таких ситуаций отражения. Он работает только со свойствами public
(без protected
или внутренних
членов и без полей).
На самом деле не существует способа сделать это быстрее , но вы можете делать это реже, кэшируя данные. Универсальный служебный класс может быть удобным способом сделать это, например:
static class PropertyCache<T>
{
private static SomeCacheType cache;
public static SomeCacheType Cache
{
get
{
if (cache == null) Build();
return cache;
}
}
static void Build()
{
/// populate "cache"
}
}
Тогда ваш PropertyCache.Cache содержит данные только для Foo и т. д. с ленивым населением. Вы также можете использовать статический конструктор, если хотите.
В ответ на (2): если вы находитесь за пределами рассматриваемого класса / сборки, internal
и protected
такие же, как private код>.
Если вы хотите получить к ним доступ, вам нужно будет запросить все свойства, как вы уже сделали, и отфильтровать список самостоятельно.