我是泛型的新手,我在 C# 中能找到的只有 List[T] - 没有别的。
这是我必须用 C# 翻译的 C++ 代码
template <class type>
type Read()
{
type t;
int s = sizeof(type);
if(index + s > size)
throw(std::exception("error 101"));
memcpy(&t, stream + index, s);
index += s;
return t;
}
是这样叫的
BYTE mode = Read<BYTE>();
DWORD mode1 = Read<DWORD>();
WORD mode2 = Read<WORD>();
问题:如何使用 C# 泛型来做到这一点?
您的代码似乎模仿了 ReadInt16 , ReadInt32和 ReadInt64 BinaryReader 的方法类。
在不了解您的全局变量的情况下很难提供重写。假设流是一个字节数组,下面的代码就可以工作。
public T Read<T>() where T : struct {
// An T[] would be a reference type, and alot easier to work with.
T[] t = new T[1];
// Marshal.SizeOf will fail with types of unknown size. Try and see...
int s = Marshal.SizeOf(typeof(T));
if (_index + s > _size)
// Should throw something more specific.
throw new Exception("Error 101");
// Grab a handle of the array we just created, pin it to avoid the gc
// from moving it, then copy bytes from our stream into the address
// of our array.
GCHandle handle = GCHandle.Alloc(t, GCHandleType.Pinned);
Marshal.Copy(_stream, _index, handle.AddrOfPinnedObject(), s);
_index += s;
// Return the first (and only) element in the array.
return t[0];
}
我是一名优秀的程序员,十分优秀!