Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#为什么使用反射获取字段对象,第一个字段来自子对象,然后来自基类_C#_Reflection - Fatal编程技术网

C#为什么使用反射获取字段对象,第一个字段来自子对象,然后来自基类

C#为什么使用反射获取字段对象,第一个字段来自子对象,然后来自基类,c#,reflection,C#,Reflection,每个对象首先存储基类属性,然后存储子类属性。但当我尝试使用reflection GetFields方法获取对象属性时,我得到了以下结果: Int32 j Int32 i 当我期待的时候 Int32 i Int32 j 代码示例 using System; using System.Reflection; namespace MyProgram { class Program { static void Main() {

每个对象首先存储基类属性,然后存储子类属性。但当我尝试使用reflection GetFields方法获取对象属性时,我得到了以下结果:

Int32 j
Int32 i
当我期待的时候

Int32 i
Int32 j
代码示例

using System;
using System.Reflection;
namespace MyProgram
{
    class Program
    {
        static void Main()
        {
            Type t = typeof(B);
            FieldInfo[] fields = t.GetFields(BindingFlags.Instance | BindingFlags.Public);
            foreach (FieldInfo fi in fields)
            {
                Console.WriteLine(fi);
            }
            Console.ReadKey();
        }

    }

    class A
    {
        public int i = 1;
    }

    class B : A
    {
        public int j = 2;
    }
}

问:你知道为什么GetFields以不同的顺序返回属性吗(这与它们的存储顺序不同)?

为什么这很重要?您的逻辑无论如何都不应该依赖于返回字段的顺序,因为它是:

GetFields方法不按特定顺序返回字段, 如字母顺序或声明顺序。您的代码不能依赖于 返回字段的顺序,因为顺序不同


如果要处理
B
的字段,而不关心基类
A
的字段,请使用:

指定仅在提供的 应考虑类型的层次结构。继承的成员不是 考虑过


你的问题是什么?这段代码的输出是什么?它与您期望/想要的有什么不同?很久以前,当我还是一名初级软件开发人员时,我就提出了这个问题,现在我意识到顺序确实不符合要求,我的逻辑不应该依赖于此。