Оптимизация отражений с атрибутами. - PullRequest
2 голосов
/ 31 октября 2008

Есть ли способ в C #:

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

  2. Если мне нужны все свойства Public, Internal и Protected, но НЕ private, я не могу найти способ сделать это. Я могу сделать только это:

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

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

Ответы [ 4 ]

2 голосов
/ 01 ноября 2008

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

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 голосов
/ 31 октября 2008

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

1 голос
/ 31 октября 2008

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

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

1 голос
/ 31 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...