c# - 获取非显式字段偏移量

标签 c# .net reflection clr

我有以下类(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/

相关文章:

c# - 实现每个属性更改跟踪

c# - string.IndexOf() 无法识别修改后的字符

c# - 如何使用微软的 Dynamics AX 类?

c# - 在运行时使用字符串调用函数

.net - OrderedDictionary 在 .NET 4 中发生了重大变化?

c# - 如何获取数组字段的 FieldInfo?

c# - 使用 IEnumerable<T> 作为方法的输入

.net - 如何重构/重建以 WinForms 风格开发的 WPF 应用程序

java - 尝试反射(reflect)接受泛型类型的方法

java - 递归读取任何 java 对象并将复杂类型提取到 HashMap 中