Как перебрать внутренние свойства в C # - PullRequest
26 голосов
/ 28 сентября 2011
public class TestClass
{
        public string property1 { get; set; }
        public string property2 { get; set; }

        internal string property3 { get; set; }
        internal string property4 { get; set; }
        internal string property5 { get; set; }
}

Я могу перебирать свойства с помощью следующего цикла, но он показывает только общедоступные свойства. Мне нужны все свойства.

foreach (PropertyInfo property in typeof(TestClass).GetProperties())
{
    //do something
}

Ответы [ 6 ]

57 голосов
/ 28 сентября 2011

Вы должны указать, что вам не нужны публичные свойства, используя перегрузку , принимающую BindingFlags:

foreach (PropertyInfo property in typeof(TestClass)
             .GetProperties(BindingFlags.Instance | 
                            BindingFlags.NonPublic |
                            BindingFlags.Public))
{
    //do something
}

Добавить BindingFlags.Static если вы хотите включить статические свойства.

Перегрузка без параметров возвращает только открытые свойства.

10 голосов
/ 28 сентября 2011

Вам нужно изменить BindingFlags на вашем звонке на Type.GetProperties

Попробуйте:

var instanceProperties = typeof(TestClass).GetProperties(
    BindingFlags.Public |
    BindingFlags.NonPublic | 
    BindingFlags.Instance
);
foreach(var instanceProperty in instanceProperties) {
    // a little something something for the instanceProperty
}
5 голосов
/ 28 сентября 2011

Согласно MSDN , частный и внутренний не распознаются в Reflection API.

Чтобы определить внутренний метод с помощью Reflection, используйте IsAssembly имущество. Чтобы определить защищенный внутренний метод, используйте IsFamilyOrAssembly.

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

И, наконец, вам действительно нужны внутренние свойства ...

3 голосов
/ 28 сентября 2011

, указывая флаги привязки в GetProperties:

foreach (PropertyInfo property in typeof(TestClass).GetProperties(
      BindingFlags.Instance|
      BindingFlags.Public|
      BindingFlags.NonPublic))
3 голосов
/ 28 сентября 2011

Использование BindingFlags

foreach (PropertyInfo property in typeof(TestClass)
        .GetProperties(
            BindingFlags.Public |
            BindingFlags.NonPublic |
            BindingFlags.Instance))
{
    //do something
}
0 голосов
/ 09 июля 2019

Внутренние свойства типа можно получить, запросив свойства NonPublic и затем отфильтровав их методы Get с помощью «IsAssembly».

«внутренне защищенным» свойствам присвоены их получатели, помеченные как «IsFamilyOrAssembly», «защищенные свойства как «IsFamily» и «частные» свойства, помеченные как «IsPrivate»:

    public class TestClass
    {
        public string Property1 { get; set; }
        private string Property2 { get; set; }

        public string Property9 { get; set; }
        private string Property10 { get; set; }

        protected internal string Property3 { get; set; }
        protected string Property4 { get; set; }
        internal string Property5 { get; set; }

        protected internal int Property6 { get; set; }
        protected int Property7 { get; set; }
        internal int Property8 { get; set; }

        internal static void ShowPropertyAccessScope(Type t)
        {

            foreach (var prop in t.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                Console.WriteLine("{0,-28} {1,15}", "Public property:", prop.Name);
            }

            var nonPublic = t.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsAssembly == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Internal property:", prop.Name);
            }

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsFamilyOrAssembly == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Internal protected property:", prop.Name);
            }

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsFamily == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Protected property:", prop.Name);
            }

            foreach (var prop in nonPublic.Where(p => p.GetGetMethod(true)?.IsPrivate == true))
            {
                Console.WriteLine("{0,-28} {1,15}", "Private property:", prop.Name);
            }
        }
        static void Main() 
        {
            ShowPropertyAccessScope(typeof(TestClass));
        }
    }
...