Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

if GetFields() doesn't guarantee order, how does LayoutKind.Sequential work

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.

like image 541
Lee Louviere Avatar asked Nov 09 '11 15:11

Lee Louviere


2 Answers

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.

like image 128
Ani Avatar answered Nov 12 '22 10:11

Ani


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!

like image 39
unlikely Avatar answered Nov 12 '22 08:11

unlikely