2010-10-21 4 views
1

Actuellement je fais quelque chose comme ceci:L'ordre de FieldInfo [] Type.GetFields() est-il garanti?

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

Actuellement, cela fonctionne. J'ai réalisé aujourd'hui, cela dépend des champs retournés de GetFields() dans l'ordre que je les ai déclarés dans la classe. Est-ce toujours le comportement attendu? Seulement dans .NET?

EDIT: S'il y a cases quand cela ne fonctionne pas, est-ce que je peux supposer que cela fonctionnera tant que je ne fais rien pour bouleverser le cache?

Répondre

4

La méthode GetFields ne renvoie pas les valeurs FieldInfo dans un ordre particulier. Voici l'extrait de la documentation pertinente de MSDN

La méthode GetFields ne retourne pas les champs dans un ordre particulier, telles que l'ordre alphabétique ou déclaration. Votre code ne doit pas dépendre de l'ordre dans lequel les champs sont retournés, car cet ordre varie.

+0

Oh, bonjour vieille question. Laissez-moi accepter une réponse ... En y repensant maintenant, plus vieux, plus sage ... si je persistais à le faire de cette façon, je trierais avec LINQ sur le GetFields(). – maxwellb

+0

Cela semble également être vrai pour GetProperties() et par conséquent pour RuntimeReflectionExtensions.GetRuntimeProperties() et RuntimeReflectionExtensions.GetRuntimeFields(). –

0

Je pense que vous pouvez trier le tableau en utilisant à nouveau FieldInfo.FieldHandle

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