私はバッファにストリームを読み込み、与えられた構造体にロードするこれらの2つの関数を持っています。これらの構造体関数を汎用化する方法は?
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();
}
}
これらを組み合わせて構造体のいずれかを取る汎用関数にしたいのですが、これを行う正しい方法はわかりません。
これは正しい方法ですか?
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();
}
}
これはかなりokコードと思われます。 – Gelootn
よろしくお願いいたします。私が作ったジェネリック版は間違っていたが、それがなぜ間違っていたかについては何の洞察も提供してくれなかったという人もいました。私はここで尋ねると思った。ありがとう! – pfinferno
おそらく 'HeaderSize'をパラメータとして渡すべきでしょう... T. – xanatos