这个反射代码出了什么问题?GetFields()返回一个空数组

Chr*_*all 23 c# reflection type-parameter

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; }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 66

无参数GetFields()返回公共字段.如果您想要非公开的,请使用:

cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)

或任何适当的组合你想要的-但你需要指定的至少一个InstanceStatic,否则将无法找到任何.您既可以指定两个,也可以指定公共字段,以获取所有内容:

cc.GetType().GetFields(BindingFlags.Instance | 
                       BindingFlags.Static |
                       BindingFlags.NonPublic |
                       BindingFlags.Public);
Run Code Online (Sandbox Code Playgroud)

  • +1这是一个,您必须*指定实例以及NonPublic. (4认同)

Ree*_*sey 11

由于该字段是私有的,因此您需要使用允许您指定BindingFlags.NonPublic的GetFields()重载.

要使其工作,请将其更改为:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)


Agi*_*Jon 5

您需要指定您想要私有(NonPublic)字段

改成:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)

  • 这也将返回0个元素.除了BindingFlags.NonPublic之外,还需要包含BindingFlags.Instance. (2认同)