我正在尝试用C#优化解析器组合器。当序列化格式与内存中格式匹配时,一种可能的优化是只对要在该类型的一个实例或什至多个实例上解析的数据执行(不安全的)memcpy。我想编写代码来确定内存格式是否与序列化格式匹配,以便动态确定是否可以应用优化。(显然,这是一个不安全的优化,可能由于一大堆微妙的原因而无法工作。我只是在试验,不打算在生产代码中使用它。)我使用属性[StructLayout(LayoutKind.Sequential,Pack=1)]强制不填充并强制内存中的顺序与声明顺序匹配。我用反射检查该属性,但实际上所有这些都确认是“无填充”。我还需要字段的顺序。(我强烈希望不必为每个字段
我需要以关于声明顺序的保证顺序获取字段信息。现在我正在使用属性来指定顺序。有没有更自动化的方法来做到这一点?有没有人知道LayoutKind.Sequential是如何工作的,我是否可以应用它的技术。我不明白LayoutKind.Sequential是如何工作的,除非有一些预编译器代码添加了属性。 最佳答案 如果您希望Type.GetFields返回的字段顺序稳定,请尝试按MetadataToken排序属性(property)。TypemyType=...BindingFlagsflags=...IEnumerableordered
如果结构包含DateTime字段,为什么LayoutKind.Sequential的工作方式不同?考虑以下代码(必须在启用“不安全”的情况下编译的控制台应用程序):usingSystem;usingSystem.Runtime.InteropServices;namespaceConsoleApplication3{staticclassProgram{staticvoidMain(){Innertest=newInner();unsafe{Console.WriteLine("Addressofstruct="+((int)&test).ToString("X"));Console.