2008-10-31 2 views
2

Есть ли способ в C# для:.Оптимизация отражений с атрибутами.

  1. Получить все свойства класса, которые имеют атрибуты на них (в зависимости от того, чтобы перебрать все свойства, а затем проверить, если атрибут существует

  2. Если я хочу, чтобы все публичные, внутренние и защищенные свойства, но не частные свойства, я не могу найти способ сделать это. Я могу только это сделать:

    PropertyInfo [] props = type.GetProperties (BindingFlags.Instance | BindingFlags .Public | BindingFlags.NonPublic)

Есть ли способ избежать получения частной собственности, но все же получить все остальное.

+0

Частная собственность? Точка свойств заключается в том, чтобы выставлять ваши частные поля экземпляра. Не уверен, почему вы хотели бы получить частные объекты в первую очередь. – 2008-10-31 16:22:29

+0

I DONT хочу частную собственность. . Это вопрос о том, как ИЗБЕЖАТЬ его, глядя на частные объекты. – leora 2008-10-31 17:47:17

ответ

1

Я не верю, что есть способ сделать это.

Просто, сколько типов вы должны задумать? Это действительно узкое место? Можно ли кэшировать результаты, чтобы избежать необходимости делать это более одного раза для каждого типа?

1

В ответ на (2): Если вы находитесь за пределами рассматриваемого класса/сборки, internal и protected - это то же самое, что и private.

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

2

Что касается кэширования: если вы получаете доступ к свойствам через TypeDescriptor.GetProperties, вы получаете бесплатное кеширование. Класс TypeDescriptor имеет некоторые другие полезные методы утилиты для таких ситуаций отражения. Он работает только на public свойствах (нет protected или internal пользователей и без полей).

2

На самом деле нет способа сделать это быстрее - но вы можете делать это реже, кэшируя данные. Родовой утилит класс может быть удобным способом сделать это, например:

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, и т.д. - с ленивым населением. Вы также можете использовать статический конструктор, если хотите.

Смежные вопросы