C# 如何使C“能够看到”;“模板式类型”;T在结构中内置函数,如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)); } 模板 静态无效GetBytesArrayFrom(T值,字节*out\u数组) { 联合字节转换器 { T值; 字节数组[sizeof(T)]; }; 字节转换器bc; bc.value=值; memcpy(out_数组,bc.bytes_数组,sizeof(T)); }

C# 如何使C“能够看到”;“模板式类型”;T在结构中内置函数,如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)); } 模板 静态无效GetBytesArrayFrom(T值,字节*out\u数组) { 联合字节转换器 { T值; 字节数组[sizeof(T)]; }; 字节转换器bc; bc.value=值; memcpy(out_数组,bc.bytes_数组,sizeof(T)); },c#,function,templates,structure,C#,Function,Templates,Structure,现在我试图在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_a

现在我试图在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;
}
public void GetBytesFrom(T值,字节[]out\u数组),其中T:object
{
结构字节转换器
{
[字段偏移量(0)]
T值;//T在这里是未知的
[字段偏移量(0)]
byte[]bytes_array=新字节[sizeof(T)];//这里
}
int检验=0;
}
看来我根本无法在函数中定义struct。

那么,如何在C#中实现相同的冷转换函数呢?

FWIW在方法中有一个显式定义的
结构在C#中是不可能的(可能是在MSIL中,也可能是在其他.NET语言中,但我不确定)

但是,在.net中,您可以使用与
memcpy
基本相同的函数,但只适用于基本类型(int、double、char、byte等)。对于其他类型,您需要使用
Array.Copy


<>我的C++有点生疏,但是我认为C++的函数在非原始类型时是最好的平台/编译器。在方法中显式地定义了一个<代码> >结构> <代码>,在C语言中是不可能的(可能是在MSIL,因此是在其他.NET语言中,但我不确定)。
static void GetBytes<T>(T obj, byte[] data)
{
    unsafe
    {
        fixed (byte* pData = data)
        {
            Marshal.StructureToPtr(obj, (IntPtr)pData, false /*careful...*/);
        }
    }
}
但是,在.net中,您可以使用与
memcpy
基本相同的函数,但只适用于基本类型(int、double、char、byte等)。对于其他类型,您需要使用
Array.Copy

<>我的C++有点生疏,但是我认为C++函数在非原始类型时最好是平台/编译器。

<代码>静态空隙GETBEYBASE(T Obj[2],字节[]数据)
static void GetBytes<T>(T obj, byte[] data)
{
    unsafe
    {
        fixed (byte* pData = data)
        {
            Marshal.StructureToPtr(obj, (IntPtr)pData, false /*careful...*/);
        }
    }
}
{ 不安全的 { 固定(字节*pData=数据) { Marshal.StructureToPtr(obj,(IntPtr)pData,false/*小心…*/); } } }
static void GetBytes(T obj,byte[]数据)
{
不安全的
{
固定(字节*pData=数据)
{
Marshal.StructureToPtr(obj,(IntPtr)pData,false/*小心…*/);
}
}
}

您试图如何处理对象到字节[]的转换?序列化?@ken2k,是的,但我知道序列化,但我不喜欢它的工作方式。它将字段名添加到二进制数据、程序集信息等中。我只需要表示结构/类/类型数据的普通字节,就像在C++中一样。对于对象到字节[]的转换,您想做什么?序列化?@ken2k,是的,但我知道序列化,但我不喜欢它的工作方式。它将字段名添加到二进制数据、程序集信息等中。我只需要表示结构/类/类型数据的普通字节,就像在C++@Kosmos:Sure中一样。但是,请确保
T
没有嵌入引用(直接或间接)。如果是这样的话,那么在使用完指针后,您就必须在指针上使用
Marshal.DestroyStructure
,但您将无法这样做,因为数组可能已在内存中移动(并因此无效)。小心…@Kosmos:当然。但是,请确保
T
没有嵌入引用(直接或间接)。如果是这样的话,那么在使用完指针后,您就必须在指针上使用
Marshal.DestroyStructure
,但您将无法这样做,因为数组可能已在内存中移动(并因此无效)。小心。。。