如果不使用结构实例,直接获取非静态结构字段的地址,将会产生编译错误。因为非静态结构字段必须通过结构实例来访问。
以下是一个使用结构实例访问非静态结构字段的示例代码:
using System;
public struct MyStruct
{
    public int value;
}
public class Program
{
    public static void Main()
    {
        MyStruct myStruct = new MyStruct();
        myStruct.value = 10;
        IntPtr address = GetFieldAddress(myStruct, "value");
        Console.WriteLine("Address: " + address.ToString("x"));
        // 通过结构实例和字段地址获取字段的值
        int fieldValue = GetFieldValue(myStruct, address);
        Console.WriteLine("Field Value: " + fieldValue);
    }
    public static IntPtr GetFieldAddress(object obj, string fieldName)
    {
        IntPtr ptr = IntPtr.Zero;
        Type type = obj.GetType();
        System.Reflection.FieldInfo fieldInfo = type.GetField(fieldName);
        if (fieldInfo != null)
        {
            ptr = fieldInfo.FieldHandle.Value;
        }
        return ptr;
    }
    public static T GetFieldValue(object obj, IntPtr address)
    {
        return (T)System.Runtime.InteropServices.Marshal.PtrToStructure(address, typeof(T));
    }
}
  
在上面的示例中,我们首先创建了一个结构MyStruct,其中包含一个非静态字段value。然后我们在Main方法中创建了一个MyStruct的实例myStruct,并给字段value赋值为10。
接下来,我们使用GetFieldAddress方法获取myStruct实例中字段value的地址,并打印出来。
最后,我们使用GetFieldValue方法通过结构实例和字段地址来获取字段的值,并打印出来。
请注意,以上代码中使用了反射来获取字段的地址和值。反射是一种强大的工具,但也会带来一些性能上的开销。在实际应用中,应该慎重使用反射,尽量避免不必要的开销。
                    上一篇:不使用解构的情况下打印两个值