如何在运行时确定带Structure约束的泛型类型的字节长度?
获取泛型结构类型的字节长度以用于MemoryMappedFile视图访问器
我明白你现在的需求:在运行时确定泛型约束为Structure的类型T的字节长度,这样就能计算出需要写入内存映射文件的总字节数,进而创建对应的视图访问器来操作数据。在VB.NET里,我们可以借助System.Runtime.InteropServices.Marshal类的方法来精准获取结构的字节大小,下面是具体的实现方案:
首先,你需要确保代码文件顶部导入必要的命名空间:
Imports System.Runtime.InteropServices Imports System.IO.MemoryMappedFiles
接下来是完整的CTest(Of T As Structure)类实现,我把你未写完的Append方法补全,同时处理内存映射文件的写入逻辑:
Private goVirtualFile As MemoryMappedFile Private glLength As Long = 0 Public Class CTest(Of T As Structure) Public Sub Append(tData As T()) If tData Is Nothing OrElse tData.Length = 0 Then Return End If ' 获取单个结构的字节长度 Dim iStructLen As Integer = Marshal.SizeOf(GetType(T)) ' 计算需要写入的总字节数 Dim totalBytes As Long = tData.Length * iStructLen ' 创建或获取内存映射文件的视图访问器,支持写入 Using accessor As MemoryMappedViewAccessor = goVirtualFile.CreateViewAccessor(glLength, totalBytes) For Each dataItem As T In tData ' 将结构写入到内存映射文件的指定位置 accessor.Write(glLength, dataItem) ' 更新当前已写入的长度 glLength += iStructLen Next End Using End Sub ' 建议补充构造函数,初始化MemoryMappedFile Public Sub New(mappedFile As MemoryMappedFile) goVirtualFile = mappedFile End Sub End Class
关键细节说明:
Marshal.SizeOf(GetType(T)):这个方法会返回指定值类型(这里是结构T)在非托管内存中的字节大小,对于符合Structure约束的类型来说,它能精准反映结构实际占用的内存字节数,完全满足你的需求。- 视图访问器的创建:
CreateViewAccessor方法的第一个参数是起始偏移量(也就是我们维护的glLength,记录已写入的总长度),第二个参数是本次要写入的字节数,这样就能在内存映射文件的末尾追加数据。 - 结构写入:
MemoryMappedViewAccessor.Write方法直接支持写入值类型,所以可以把结构dataItem直接写入到指定偏移位置,非常方便。
需要注意的是,如果你的结构T使用了StructLayout属性自定义了内存布局(比如指定了Pack大小),Marshal.SizeOf也会根据这个布局计算出正确的字节长度,不用担心兼容性问题。
内容的提问来源于stack exchange,提问作者user1889116
相关产品推荐
相关产品推荐

