Гарантирован ли порядок FieldInfo [] Type.GetFields ()? - PullRequest
1 голос
/ 22 октября 2010

В настоящее время я делаю что-то вроде этого:

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?

РЕДАКТИРОВАТЬ: Если есть случаев , когда это не работает, могу ли я предположить, что это будет работать, пока я ничего не делаю, чтобы нарушить кэш?

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

Нет, метод GetFields не возвращает значения FieldInfo в каком-либо конкретном порядке.Вот соответствующий фрагмент документации от MSDN

Метод GetFields не возвращает поля в определенном порядке, таком как алфавитный порядок или порядок объявления.Ваш код не должен зависеть от порядка, в котором возвращаются поля, потому что этот порядок варьируется.

0 голосов
/ 28 ноября 2011

Я думаю, что вы можете снова отсортировать массив, используя FieldInfo.FieldHandle

        FieldInfo[] infos = GetType().GetFields();
        Array.Sort(infos, delegate(FieldInfo first, FieldInfo second)
        {
            return first.FieldHandle.Value.ToInt32().CompareTo(second.FieldHandle.Value.ToInt32());
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...