我有一系列的类,每个类都针对特定的类型(SELECT * from account WHERE accountId = (SELECT payersAccountId FROM transaction WHERE sessionId = 1)
,Byte
,UInt16
等;每个类都由Double
定义)。每个类都有几乎相同的代码,但会对其特定类型进行一些强制转换。
注意:有一个类成员定义为:
TypeCode
和
void* _baseAddress;
一种简化的示例方法:
ClassX* _table;
我想假设我有一个由 public unsafe UInt16 GetValue(int x)
{
return *((UInt16*) _baseAddress + (_table+ x)->entry);
}
定义的名为MyType
的类成员,来做到这一点:
typeof(inputType)
这显然行不通。我一直在尝试阅读 public unsafe object GetValue(int x)
{
return *((MyType*) _baseAddress + (_table+ x)->entry);
}
和Func
的用法,但一直碰到一堵墙,无法按照我的意愿转换void *。
因为我认为它增加了上下文。这是尝试获取在给定位置的值。我有一个应该具有的镜像方法:
delegates
注意:性能很重要。我无法分配新的内存,也无法在转换中消耗大量的处理器时间
答案 0 :(得分:0)
如果我正确理解了您的问题,这将满足您的要求:
/// <summary>
/// Maps the supplied byte array onto a structure of the specified type.
/// </summary>
public static T ToStructure<T>(byte[] data)
{
unsafe
{
fixed (byte* p = &data[0])
{
return (T)Marshal.PtrToStructure(new IntPtr(p), typeof(T));
}
};
}
这说明了原理。您应该能够使其适应您的特定目的。
此功能执行相反的操作:
/// <summary>
/// Converts the supplied object to a byte array.
/// </summary>
public static byte[] ToByteArray(object obj)
{
int len = Marshal.SizeOf(obj);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
Marshal
在System.Runtime.InteropServices
中。
如果需要绝对最快的速度,请查看here。
您还应该查看BitConverter类。