相关疑难解决方法(0)

通用结构的大小

我需要找出一个通用结构的大小(我不能像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)?(或者是一个不同的解决方案,但我想缓存一个函数(委托)而不是第二个答案中提出的结果)

c# generics il structure sizeof

6
推荐指数
3
解决办法
7736
查看次数

具有泛型类型字段的struct的大小

我想估计包含泛型类型参数的结构数组的大小,在本例中是一个字典条目结构.要做到这一点,我需要结构的大小.

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]'封送为非托管结构; 不能计算有意义的大小或偏移量.

.net c# struct

4
推荐指数
1
解决办法
3712
查看次数

标签 统计

c# ×2

.net ×1

generics ×1

il ×1

sizeof ×1

struct ×1

structure ×1