.NET反射:确定类字段的大小

Jay*_*Fix 1 c# reflection field sizeof

目标:以编程方式确定类的字段的大小(以字节为单位).例如,请参阅下面的评论......

class MyClass
    {
    public  byte    b ;
    public  short   s ;
    public  int i ;
    }

class MainClass
    {
    public static void Main()
        {
        foreach ( FieldInfo fieldInfo
            in typeof(MyClass).GetFields(BindingFlags.Instance
             | BindingFlags.Public | BindingFlags.NonPublic) )
            Console.WriteLine ( fieldInfo.FieldType ) ;

        // output is:
        //    System.Byte
        //    System.Int16
        //    System.Int32

        // desired: to include "sizeof" each type (in bytes) ...
        //    System.Byte     1
        //    System.Int16    2
        //    System.Int32    4
        }
    }
Run Code Online (Sandbox Code Playgroud)

Nol*_*rin 10

您只想Marshal.SizeOfSystem.Runtime.InteropServices命名空间中使用该方法.

foreach (var fieldInfo in typeof(MyClass).GetFields(BindingFlags.Instance |
    BindingFlags.Public | BindingFlags.NonPublic))
{
    Console.WriteLine(Marshal.SizeOf(fieldInfo.FieldType));
}
Run Code Online (Sandbox Code Playgroud)

但请注意备注部分中的以下段落:

返回的大小实际上是非托管类型的大小.对象的非托管和托管大小可以不同.对于字符类型,大小受应用于该类的CharSet值的影响.

这些差异可能是无关紧要的,这取决于你的目的......我甚至不确定它是否可能在管理内存中获得确切的大小(或者至少没有很大的困难).