Вопрос

Есть ли способ в 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 .

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top