Недавно я столкнулся с ситуацией, когда мне нужно создать универсальный метод для чтения типа данных из байтового массива.
Я создал следующий класс:
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;
}
}
}
Теперь, если оставить в стороне проблемы с выделением ресурсов, этот код не компилируется с этим сообщением:
Cannot take the address of, get the size of, or declare a pointer to a managed type ('T')
Что, кажется странным, потому что вы должны быть в состоянии выполнить вышеупомянутые операции, основываясь на ограничении where T : struct
для метода.
Если этот код ужасно неправильный, есть ли простой способ взять серию байтов и привести их к типу 'T
'?
Спасибо!