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?
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
Cela semble également être vrai pour GetProperties() et par conséquent pour RuntimeReflectionExtensions.GetRuntimeProperties() et RuntimeReflectionExtensions.GetRuntimeFields(). –