如何使C#能够看到“;类似模板的类型“;结构中的T内置函数,类似于C++

本文关键字:结构 类型 内置 C++ 类似于 函数 何使 | 更新日期: 2023-09-27 18:24:58

我在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#中做同样的酷转换函数呢?

如何使C#能够看到“;类似模板的类型“;结构中的T内置函数,类似于C++

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

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

然而,在.net中,你可以使用Buffer.BlockCopy函数,它本质上与memcpy相同,但只适用于基元类型(int、double、char、byte等)。对于其他类型,你需要使用Array.Copy

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