我需要找出一个通用结构的大小(我不能像sizeof(T)或使用Marshal.SizeOf(...)0>给我一个错误)
所以我写道:
public static class HelperMethods
{
static HelperMethods()
{
SizeOfType = createSizeOfFunc();
}
public static int SizeOf<T>()
{
return SizeOfType(typeof(T));
}
public static readonly Func<Type, int> SizeOfType = null;
private static Func<Type, int> createSizeOfFunc()
{
var dm = new DynamicMethod("SizeOfType", typeof(int), new Type[] { typeof(Type) });
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Sizeof); //needs to be il.Emit(OpCodes.Sizeof, typeof(something))
il.Emit(OpCodes.Ret);
var func = (Func<Type, int>)dm.CreateDelegate(typeof(Func<Type, int>));
return func;
}
}
Run Code Online (Sandbox Code Playgroud)
一个不同之处是il.Emit(OpCodes.Sizeof)需要一个参数,在创建方法(SizeOfType)时我无法传递它.如何使用IL将堆栈中的参数传递给il.Emit(OpCodes.Sizeof)?(或者是一个不同的解决方案,但我想缓存一个函数(委托)而不是第二个答案中提出的结果)
我想估计包含泛型类型参数的结构数组的大小,在本例中是一个字典条目结构.要做到这一点,我需要结构的大小.
struct Entry
{
int hash;
int next;
TKey key;
TValue value;
}
Run Code Online (Sandbox Code Playgroud)
如何获得此结构的字节大小?
编辑
似乎使用Marshal.SizeOf是有问题的.传递结构的类型将引发一个异常,说该参数不能是泛型类型定义.
如果我改为调用带有实例的重载,例如,Marshal.SizeOf(default(Entry))如果两个泛型类型参数都是值类型,它将起作用.如果泛型参数是例如,<int, object>则抛出此异常
无法将字典`2 + Entry [System.Int32,System.Object]'封送为非托管结构; 不能计算有意义的大小或偏移量.