最近、バイト配列からデータ型を読み取るジェネリック メソッドを作成する必要がある状況に遭遇しました。
次のクラスを作成しました。
public class DataStream
{
public int Offset { get; set; }
public byte[] Data { get; set; }
public T Read<T>() where T : struct
{
unsafe
{
int dataLen = Marshal.SizeOf( typeof( T ) );
IntPtr dataBlock = Marshal.AllocHGlobal( dataLen );
Marshal.Copy( Data, Offset, dataBlock, dataLen );
T type = *( ( T* )dataBlock.ToPointer() );
Marshal.FreeHGlobal( dataBlock );
Offset += dataLen;
return type;
}
}
}
さて、割り当て解除の問題は別として、このコードは次のメッセージでコンパイルされません。
マネージド型 ('T') のアドレスを取得したり、サイズを取得したり、ポインタを宣言したりすることはできません
where T : structメソッドの制約に基づいて上記の操作を実行できるはずなので、これは奇妙に思えます。
このコードがひどく間違っている場合、一連のバイトを取得して ' T' 型にキャストする簡単な方法はありますか?
ありがとう!