Lee*_*ere 21 c# reflection marshalling
我需要在声明顺序的保证顺序中获取fieldinfo.现在我正在使用属性来指定顺序.
有更自动的方式吗?
有没有人知道如何LayoutKind.Sequential工作,如果我可以应用它的技术.
LayoutKind.Sequential除非有一些添加属性的预编译器代码,否则我看不出它是如何工作的.
Ani*_*Ani 17
如果您希望返回的字段的顺序Type.GetFields 是稳定的,请尝试按MetadataToken属性进行排序.
Type myType = ...
BindingFlags flags = ...
IEnumerable<FieldInfo> orderedFields = myType.GetFields(flags)
.OrderBy(field => field.MetadataToken);
Run Code Online (Sandbox Code Playgroud)
根据经验,已经发现以这种方式排序字段以声明顺序返回它们,尽管没有记录.
顺便说一下,问题并不完全有意义; 没有任何理由相信反射API以任何方式与运行时如何在内存中放置对象相关联.
这个问题很老但不是那么老......我现在正在处理同样的问题。而且我更喜欢按照声明的顺序获取字段。以下调用应适用于值类型或格式化的引用类型。
var fields = type.GetFields().OrderBy(f => Marshal.OffsetOf(type, f.Name).ToInt32());
Run Code Online (Sandbox Code Playgroud)
享受!