代码之家  ›  专栏  ›  技术社区  ›  maxwellb

FieldInfo[]type.getFields()的顺序是否有保证?

  •  1
  • maxwellb  · 技术社区  · 14 年前

    目前我做的事情如下:

    class Foo {
        // Declare Fields
        [FieldName("F_BAR")] public int?    Bar;
        [FieldName("F_BAZ")] public int?    Baz;
        [FieldName("BLARG")] public double? Bee;
    
        // And a custom selector
        public static string FooFields() {
            // which looks something like:
            StringBuilder fields = new StringBuilder();
            foreach( FieldInfo f in typeof(Foo).GetFields() )
                fields.Append(", " +
                    f.GetCustomAttributes(
                        typeof(FieldNameAttribute),
                        false)[0].FieldName );
            return fields.ToString().Substring(2);
        }
        // .. which will be used like this:
        public static string ExampleSelect() {
            return "select " + Foo.FooFields() + " from tablename";
        }
    
        // And a custom reader, formatted for the custom selector
        public static Foo Read(DbDataReader reader) {
            int i = -1;
            return new Foo {
                Bar = reader.IsDBNull(++i)
                    ? (int?)null
                    : Convert.ToInt32(reader.GetValue(i)),
                Baz = reader.IsDBNull(++i)
                    ? (int?)null
                    : Convert.ToInt32(reader.GetValue(i)),
                Bee = reader.IsDBNull(++i)
                    ? (double?)null
                    : Convert.ToDouble(reader.GetValue(i))
            };
        }
    }
    

    目前,它是有效的。我今天意识到,这取决于从 GetFields() 按照我在课堂上宣布的顺序。这总是预期的行为吗?只在.NET中?

    编辑:如果有 cases 当它不起作用时,我能假设它会起作用,只要我不做任何事情来破坏缓存吗?

    2 回复  |  直到 12 年前
        1
  •  4
  •   JaredPar    14 年前

    没有 GetFields 方法不返回 FieldInfo 任何特定顺序的值。以下是相关文档片段 MSDN

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

        2
  •  0
  •   user1069711    12 年前

    我认为您可以使用fieldinfo.fieldhandle再次对数组进行排序

            FieldInfo[] infos = GetType().GetFields();
            Array.Sort(infos, delegate(FieldInfo first, FieldInfo second)
            {
                return first.FieldHandle.Value.ToInt32().CompareTo(second.FieldHandle.Value.ToInt32());
            });