如果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不要在内存优化中做任何会弄乱字段顺序的内容。