C# 在C中打包泛型类型#

C# 在C中打包泛型类型#,c#,casting,binary,C#,Casting,Binary,我正在尝试用c#编写一个位打包器,并尝试使用动态变量来处理更大范围的值,而不是为每个基元类型重载pack函数。目前,我只希望传入在GetSizeOf函数中找到的变量类型,如果传入任何其他变量,则将引发异常。但我很难将价值投射到ulong中。我试过使用int32、byte和int。此外,数据是一个字符串,当完成打包时,它应该包含打包数据的二进制序列,包括多余的0 如果有更好的方法,请告诉我 public static int GetSizeOf<V>(V v) {

我正在尝试用c#编写一个位打包器,并尝试使用动态变量来处理更大范围的值,而不是为每个基元类型重载pack函数。目前,我只希望传入在GetSizeOf函数中找到的变量类型,如果传入任何其他变量,则将引发异常。但我很难将价值投射到ulong中。我试过使用int32、byte和int。此外,数据是一个字符串,当完成打包时,它应该包含打包数据的二进制序列,包括多余的0

如果有更好的方法,请告诉我

    public static int GetSizeOf<V>(V v)
    {
        if (v is Byte) { return sizeof(Byte) * 8; };
        if (v is SByte) { return sizeof(SByte) * 8; };
        if (v is Int16) { return sizeof(Int16) * 8; };
        if (v is UInt16) { return sizeof(UInt16) * 8; };
        if (v is Int32) { return sizeof(Int32) * 8; };
        if (v is UInt32) { return sizeof(UInt32) * 8; };
        if (v is Int64) { return sizeof(Int64) * 8; };
        if (v is UInt64) { return sizeof(UInt64) * 8; };
        throw new Exception("Unable to determine size of " + typeof(V));
    }

    public void pack<T>(T value)
    {
        if (!(value as ulong?).HasValue)
            throw new Exception("Unable to cast " + typeof(T) + " as ulong");
        ulong num = (value as ulong?).Value;
        int size = GetSizeOf(value);
        for (int i = 0; i < size; i++)
        {
            data = (num & 1) + data;
            num >>= 1;
        }
    }
publicstaticintgetsizeof(V)
{
如果(v是Byte){returnsizeof(Byte)*8;};
如果(v是SByte){returnsizeof(SByte)*8;};
如果(v是Int16){returnsizeof(Int16)*8;};
如果(v是UInt16){returnsizeof(UInt16)*8;};
如果(v是Int32){returnsizeof(Int32)*8;};
如果(v是UInt32){returnsizeof(UInt32)*8;};
如果(v是Int64){returnsizeof(Int64)*8;};
如果(v是UInt64){returnsizeof(UInt64)*8;};
抛出新异常(“无法确定”+typeof(V)的大小);
}
公共空包(T值)
{
如果(!(值为ulong?).HasValue
抛出新异常(“无法将“+typeof(T)+”转换为ulong”);
ulong num=(值为ulong?).value;
int size=GetSizeOf(值);
对于(int i=0;i>=1;
}
}

您使用的不是动态,而是泛型。这是有区别的…泛型不允许你写的东西,即使你自己做类型检查…如上所述,你不是在使用动力学,你是在使用泛型。这两种方法对于非常不同的事情很有用,这种混乱让我想知道您使用这个位打包器的目的是什么,所以我们可能会找出哪种方法更合适?对不起,我的错误。我对泛型和动力学的用法有些陌生,周末我一直在这两个方面玩得太多,以至于我有点困惑。我计划使用packer将几个变量打包成一个二进制流,然后通过udp客户端发送出去。使用它为多人纸牌游戏(羊头)发送少量数据.老实说,泛型在这里似乎也有点毫无意义-调用GetSizeOf和Pack时,您从中获得的唯一好处是强类型化-但无论如何,在调用这些方法时,您都需要指定类型…这有点挫败了泛型类型的意义,检查它到底有多糟…还不如像所有您感兴趣的类型实现
IConvertible