I need to get fieldinfo in a guaranteed order with respect to declaration order. Right now I\'m using attributes to specify order.
Is there a more automatic way of d
If you want the ordering of the fields returned by Type.GetFields
to be stable, try sorting by the MetadataToken property.
Type myType = ...
BindingFlags flags = ...
IEnumerable<FieldInfo> orderedFields = myType.GetFields(flags)
.OrderBy(field => field.MetadataToken);
Empirically, ordering fields in this manner has been found to return them in declaration order, although this isn't documented.
By the way, the question as asked doesn't entirely make sense; there isn't any reason to believe that the reflection API is tied in any way to how the runtime lays objects out in memory.
The question is old but not so old... I'm dealing now with the same problem. And I prefer to get the fields in tho order of declaration. The following call should work for a value type or a formatted reference type.
var fields = type.GetFields().OrderBy(f => Marshal.OffsetOf(type, f.Name).ToInt32());
Enjoy!
LayoutKind.Sequential specifies that the fields of the type should be laid out in memory in the same order they are declared in your source code.
Without the attribute the CLR is free to optimize memory use by rearranging the fields.
So the attribute just adds metadata that tells the CLR not to do any in memory optimalisation that messes up the order of fields.