繁体   English   中英

如何使C#能够像在C ++中那样在结构内置函数中看到“模板类型” T?

[英]How to make C# able to see “template like type” T in structure builtin function like in C++?

我在C ++中具有以下代码功能,可以将不同的对象转换为字节数组:

template <typename T>
static void GetBytesArrayFrom(T value, BYTE *out_array)
{
    union BytesConverter
    {
        T value;
        BYTE bytes_array[sizeof(T)];
    };

    BytesConverter bc;
    bc.value = value;

    memcpy(out_array, bc.bytes_array, sizeof(T));
}

现在我试图在C#中使相同的功能,但有一个问题:

public void GetBytesFrom<T>(T value, byte[] out_array) where T : object
{
    struct BytesConverter
    {
        [FieldOffset(0)] 
        T value; //T is unknown here
        [FieldOffset(0)] 
        byte[] bytes_array = new byte[sizeof(T)]; //and here
    }

int test = 0;
}

它似乎是我根本无法在函数内部定义结构。
那么如何在C#中执行相同的转换功能呢?

FWIW在C#中不可能在方法中具有在本地明确定义的struct (可能是MSIL,因此也可能是其他.NET语言,但是我不确定)。

但是,在.net中,您可以使用Buffer.BlockCopy函数,该函数本质上与memcpy相同,但仅适用于原始类型(int,double,char,byte等)。 对于其他类型,您需要使用Array.Copy

我的C ++有点生疏,但我认为您的C ++函数在涉及非基本类型时充其量仅是平台/编译器特定的。

static void GetBytes<T>(T obj, byte[] data)
{
    unsafe
    {
        fixed (byte* pData = data)
        {
            Marshal.StructureToPtr(obj, (IntPtr)pData, false /*careful...*/);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM