Что не так с этим кодом отражения? GetFields () возвращает пустой массив - PullRequest
22 голосов
/ 25 июня 2009

C #, Net 2.0

Вот код (я вынул все свои доменные данные, а он все еще возвращает пустой массив):

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ChildClass cc = new ChildClass();
            cc.OtherProperty = 1;

            FieldInfo[] fi = cc.GetType().GetFields();
            Console.WriteLine(fi.Length);
            Console.ReadLine();
        }
    }
    class BaseClass<T>
    {
        private int myVar;

        public int MyProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }


    }

    class ChildClass : BaseClass<ChildClass>
    {
        private int myVar;

        public int OtherProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }

    }
}

Ответы [ 3 ]

63 голосов
/ 25 июня 2009

Без параметров GetFields() возвращает публичные поля. Если вы хотите непубличные, используйте:

cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

или любую подходящую комбинацию, которую вы хотите - но вам do нужно указать хотя бы один из Instance и Static, иначе он тоже не найдется Вы можете указать как, так и действительно публичные поля, чтобы получить все:

cc.GetType().GetFields(BindingFlags.Instance | 
                       BindingFlags.Static |
                       BindingFlags.NonPublic |
                       BindingFlags.Public);
11 голосов
/ 25 июня 2009

Поскольку поле является закрытым, вам необходимо использовать перегрузку GetFields (), которая позволяет указывать BindingFlags.NonPublic .

Чтобы сделать это, измените его на:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
5 голосов
/ 25 июня 2009

Вам нужно указать, что вы хотите, чтобы приватные (NonPublic) поля

Изменить на:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
...