【问题标题】:What's wrong with this reflection code? GetFields() is returning an empty array这个反射代码有什么问题? GetFields() 返回一个空数组
【发布时间】:2009-06-24 20:30:32
【问题描述】:

C#,网络 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; }
        }

    }
}

【问题讨论】:

    标签: c# reflection type-parameter


    【解决方案1】:

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

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

    或您想要的任何合适的组合 - 但您确实需要指定InstanceStatic 中的至少一个,否则它也找不到。您可以同时指定公共字段,也可以指定公共字段来获取所有内容:

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

    【讨论】:

    • +1 这是一个,您必须指定 Instance 以及 NonPublic。
    • 为答案干杯!我很难理解它。有人可以解释一下为什么私有字段需要 Instance 或 Static 以及 NonPublic 吗?
    • @rory.ap:是的,没错。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您需要指定您想要私有(非公共)字段

      改为:

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

      【讨论】:

      • 这也将返回 0 个元素。除了 BindingFlags.NonPublic 之外,您还需要包含 BindingFlags.Instance。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多