我有以下类(class):
[StructLayout(LayoutKind.Sequential)]
class Class
{
public int Field1;
public byte Field2;
public short? Field3;
public bool Field4;
}
如何获得
Field4
的字节偏移量从类数据(或对象头)的开头开始?为了显示:
Class cls = new Class();
fixed(int* ptr1 = &cls.Field1) //first field
fixed(bool* ptr2 = &cls.Field4) //requested field
{
Console.WriteLine((byte*)ptr2-(byte*)ptr1);
}
在这种情况下,结果偏移量为 5,因为运行时实际上移动了
Field3
到类型的末尾(并填充它),可能是因为它的类型是通用的。我知道有 Marshal.OffsetOf
,但它返回非托管偏移量,而不是托管。如何从
FieldInfo
中检索此偏移量实例?是否有任何 .NET 方法用于此目的,或者我是否必须编写自己的方法,并考虑所有异常(类型大小、填充、显式偏移等)?
最佳答案
一些小技巧 TypedReference.MakeTypedReference
,可以获得对字段的引用,以及对象数据的开头,然后只需减去。该方法可以在 SharpUtils 中找到.
关于c# - 获取非显式字段偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30817924/