.NET Reflection: определить размеры полей класса - PullRequest
1 голос
/ 13 июля 2009

Цель: программно определить размеры (в байтах) полей класса. Например, см. Комментарии ниже ...

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
        }
    }

Ответы [ 2 ]

10 голосов
/ 13 июля 2009

Вы просто хотите использовать метод Marshal.SizeOf в пространстве имен System.Runtime.InteropServices.

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

Однако обратите внимание на следующий параграф в разделе «Примечания»:

Возвращенный размер фактически является размером неуправляемого типа. Неуправляемые и управляемые размеры объекта могут отличаться. Для типов символов на размер влияет значение CharSet, примененное к этому классу.

Эти различия, вероятно, несущественны, в зависимости от вашей цели ... Я даже не уверен, что возможно получить точный размер в управляемой памяти (или, по крайней мере, не без особых трудностей).

1 голос
/ 13 июля 2009

Обратите внимание, что сумма размеров полей не будет составлять объем памяти, используемый любым данным экземпляром класса. Заполнитель выравнивания и информация заголовка объекта, используемые CLR для различных целей, и возможные связанные примитивы синхронизации для поддержки монитора (lock ключевое слово в C #), не будут частью общей суммы.

...