我需要找出通用结构的大小(我不能像 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;
}
}
一个困难是 il.Emit(OpCodes.Sizeof) 需要一个我无法在方法 (SizeOfType) 创建期间传递它的参数。如何使用 IL 将堆栈上的参数传递给 il.Emit(OpCodes.Sizeof) ?(或不同的解决方案,但我想缓存一个函数(委托)而不是第二个答案中提出的结果)