我有这个通用列表,我想得到类型的字节大小,如果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);
}
}
想到我在这里做错了什么?
答案 0 :(得分:10)
sizeof
仅适用于非托管类型,例如内置类型(int
,float
,char
等...)。 对于引用类型,它只返回指针的大小(对于32位系统通常为4)它对于引用/托管类型根本不起作用(试试看)。
你也没有传递一个类型,你传递的是Type
类型的对象。
你可能想尝试使用Marshal.SizeOf
,但是我不确定这会给你你想要的东西,首先它只会在编组之后返回类型的大小,而不是CLR分配的大小。根据推论,这也只适用于可以编组的类型,其中列表不能编组。
你究竟想做什么?
答案 1 :(得分:10)
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;
}
如果您真的想了解有关尺寸的更多信息,请参阅主题comprehensive answer。
答案 2 :(得分:6)
您可以使用Marshal.SizeOf(typeof(T))
但请注意,它可以投放大小未知的类型。请注意Marshal.SizeoOf(typeof(char)) == 1
。