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 doing this?
Does anyone have knowledge of how LayoutKind.Sequential
works, and if I can apply its technique.
I don't see how LayoutKind.Sequential
works, unless there's some precompiler code that adds attributes.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With