Tôi có hai chức năng này đọc một dòng vào một bộ đệm và tải nó vào cấu trúc đã cho.Làm thế nào để làm cho các hàm cấu trúc này chung chung?
TestStruct1 ReadRecFromStream2(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(TestStruct1))];
stream.Read(buffer, 0, 128);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return (TestStruct1)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TestStruct1));
}
finally
{
handle.Free();
}
}
TestStruct2 ReadRecFromStream(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(TestStruct2))];
stream.Read(buffer, 0, 128);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return (TestStruct2)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(TestStruct2));
}
finally
{
handle.Free();
}
}
Tôi muốn kết hợp chúng thành một chức năng chung để thực hiện một trong các cấu trúc, tôi chỉ không chắc chắn cách thích hợp để thực hiện điều này là gì.
Đây có phải là cách chính xác không?
private T ReadRecFromStream<T>(Stream stream)
{
byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
stream.Read(buffer, 0, HeaderSize);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
try
{
return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
}
finally
{
handle.Free();
}
}
mã này có vẻ khá ok, – Gelootn
OK, cảm ơn. Có người nói với tôi trong người rằng phiên bản chung tôi đã làm sai, nhưng không cung cấp bất kỳ cái nhìn sâu sắc về lý do tại sao/làm thế nào nó đã sai. Tôi đoán là tôi sẽ hỏi ở đây. cảm ơn! – pfinferno
Có lẽ bạn nên vượt qua 'HeaderSize' làm tham số ... Trừ khi nó được sửa cho tất cả các phím T. – xanatos