我有这个通用列表,我想得到类型的字节大小,如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); } }
并想到我在这里做错什么?
解决方法
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的话题.
原文地址:https://www.jb51.cc/csharp/95819.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。