如果GetFields()不保证顺序,LayoutKind.Sequential如何工作

我需要在声明顺序的保证顺序中获取fieldinfo。 现在我正在使用属性来指定顺序。

有更自动的方式吗?

有没有人知道LayoutKind.Sequential如何工作,以及我是否可以应用它的技术。

我没有看到LayoutKind.Sequential如何工作,除非有一些预编译器代码添加属性。

如果您希望Type.GetFields返回的字段的顺序是稳定的,请尝试按MetadataToken属性进行排序。

 Type myType = ... BindingFlags flags = ... IEnumerable orderedFields = myType.GetFields(flags) .OrderBy(field => field.MetadataToken); 

根据经验,已经发现以这种方式排序字段以声明顺序返回它们 , 尽管没有记录

顺便说一句,问题并不完全有意义; 没有任何理由相信reflectionAPI以任何方式与运行时如何在内存中放置对象相关联。

这个问题很老但不是那么老……我现在正在处理同样的问题。 而且我更喜欢按照声明的顺序获取字段。 以下调用应适用于值类型或格式化的引用类型。

 var fields = type.GetFields().OrderBy(f => Marshal.OffsetOf(type, f.Name).ToInt32()); 

请享用!

LayoutKind.Sequential指定类型的字段应按照在源代码中声明的顺序在内存中布局。

如果没有该属性,CLR可以通过重新排列字段来自由优化内存使用。

因此,该属性只是添加元数据,告诉CLR不要在内存优化中做任何会弄乱字段顺序的内容。