将字节数组转换为通用值类型?
Convert byte array to generic value type?
我有一个 Stream
我想从中读取数据(作为值类型段)并根据给定类型(声明为泛型)的大小移动位置。
我目前的做法:
public byte ReadUInt8(Stream stream) {
return (byte)stream.ReadByte();
}
public ushort ReadUInt16(Stream stream) {
return (ushort)((ReadUInt8() << 8) | ReadUInt8());
}
...
我想达到的目标:
public TValue Read<TValue>(Stream stream)
where TValue : struct
{
var bufferSize = Marshal.SizeOf(typeof(TValue));
var buffer = new byte[bufferSize];
if(stream.Read(buffer, 0, bufferSize) == 0)
throw new EndOfStreamException();
return (TValue)buffer; // here's where I'm stuck
// EDIT1: A possible way would be
// return (TValue)(object)buffer;
// but that feels like kicking puppies :/
}
这有可能吗?使用 Marshal.SizeOf()
是否有任何缺点(性能方面等)?
return (TValue)buffer; // here's where I'm stuck
是的,你刚刚转移了问题。从没有 Stream.Read<T>()
到标准库中没有 Convert<T>(byte[])
。
无论如何,您都必须像 Read<int>()
这样称呼它,因此与 BinaryReader.ReadInt32()
相比没有直接优势
现在,当您想从另一个通用 class/method 中使用它时,Read<T>()
语法很有用,但对于实现,您最好将其映射到 BinaryReader 调用。恐怕需要拳击:
obcject result = null;
if (typeof(TValue) == typeof(int))
result = reader.ReadInt32();
else if (typeof(TValue) == typeof(double))
result = reader.ReadDouble();
else ...
return (TValue) result;
我有一个 Stream
我想从中读取数据(作为值类型段)并根据给定类型(声明为泛型)的大小移动位置。
我目前的做法:
public byte ReadUInt8(Stream stream) {
return (byte)stream.ReadByte();
}
public ushort ReadUInt16(Stream stream) {
return (ushort)((ReadUInt8() << 8) | ReadUInt8());
}
...
我想达到的目标:
public TValue Read<TValue>(Stream stream)
where TValue : struct
{
var bufferSize = Marshal.SizeOf(typeof(TValue));
var buffer = new byte[bufferSize];
if(stream.Read(buffer, 0, bufferSize) == 0)
throw new EndOfStreamException();
return (TValue)buffer; // here's where I'm stuck
// EDIT1: A possible way would be
// return (TValue)(object)buffer;
// but that feels like kicking puppies :/
}
这有可能吗?使用 Marshal.SizeOf()
是否有任何缺点(性能方面等)?
return (TValue)buffer; // here's where I'm stuck
是的,你刚刚转移了问题。从没有 Stream.Read<T>()
到标准库中没有 Convert<T>(byte[])
。
无论如何,您都必须像 Read<int>()
这样称呼它,因此与 BinaryReader.ReadInt32()
现在,当您想从另一个通用 class/method 中使用它时,Read<T>()
语法很有用,但对于实现,您最好将其映射到 BinaryReader 调用。恐怕需要拳击:
obcject result = null;
if (typeof(TValue) == typeof(int))
result = reader.ReadInt32();
else if (typeof(TValue) == typeof(double))
result = reader.ReadDouble();
else ...
return (TValue) result;