Как получить размер байта типа в общем списке?

У меня есть этот общий список, и я хочу получить размер байта типа, например, если T является строкой или int и т.д., я пробовал оба способа, как написано в getByteSize(), и просто чтобы вы знали, что я использую только один способ за один раз...

но когда я пытаюсь скомпилировать, он выдает сообщение об ошибке "Ошибка: тип или имя пространства имен typeParameterType" не может быть найден (вам не хватает директивы using или ссылки на сборку?) "

public class iList<T> : List<T> 
    { 
        public int getByteSize ()
        {
            // way 1
            Type typeParameterType = typeof(T);
            return sizeof(typeParameterType);

            // way 2
            Type typeParameterType = this.GetType().GetGenericArguments()[0];
            return sizeof(typeParameterType);
        }
    }

И что я здесь делаю неправильно?

Ответ 1

sizeof будет работать только над типами значений.

Для строки вы не будете знать фактический размер байта, пока не заполните его.

Если вы настроены на это, сериализуйте список и измерьте его. Хотя это не гарантированный способ, это, вероятно, лучше, чем альтернатива. Поцарапайте это. Это не даст вам то, что вы хотите, без каких-либо реальных усилий, если вообще. Вы можете выполнить быстрый и грязный счет, например:

public int getListSize()
{
    Type type = typeof(T);

    if (type.IsEnum)
    {
        return this.Sum(item => Marshal.SizeOf(Enum.GetUnderlyingType(type)));
    }
    if (type.IsValueType)
    {
        return this.Sum(item => Marshal.SizeOf(item));
    }
    if (type == typeof(string))
    {
        return this.Sum(item => Encoding.Default.GetByteCount(item.ToString()));
    }
    return 32 * this.Count;
}

Если вы действительно хотите узнать больше о размере, вот всеобъемлющий ответ по теме.

Ответ 2

sizeof работает только для неуправляемых типов, таких как встроенные типы (int, float, char и т.д...). Для ссылочных типов он просто возвращает размер указателя (обычно 4 для 32-битных систем) Он не будет работать вообще для ссылочных/управляемых типов (попробуйте его и посмотрите).

Также вы не передаете ему тип, вы передаете ему объект типа Type.

Вместо этого вы можете попытаться использовать Marshal.SizeOf, однако я не уверен, что это даст вам то, что вы хотите, для начала это только вернет размер типа после его сортировки, а не размер, выделенный CLR. По следствию это будет работать только с типами, которые могут быть сопоставлены, а списки не могут.

Что именно вы пытаетесь сделать?

Ответ 3

Вы можете использовать Marshal.SizeOf(typeof(T)), но имейте в виду, что он может использовать для типов с неизвестным размером. Имейте в виду, что Marshal.SizeoOf(typeof(char)) == 1.