Как сделать так, чтобы C # мог видеть «шаблоноподобный тип» T в структуре встроенной функции, как в C ++? - PullRequest
0 голосов
/ 18 февраля 2012

У меня есть эта функция кода в 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 #?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012
static void GetBytes<T>(T obj, byte[] data)
{
    unsafe
    {
        fixed (byte* pData = data)
        {
            Marshal.StructureToPtr(obj, (IntPtr)pData, false /*careful...*/);
        }
    }
}
2 голосов
/ 18 февраля 2012

FWIW, имеющий struct, явно определенный локально в методе, невозможен в C # (может быть в MSIL и, следовательно, в других языках .NET, но я не уверен).

Однако в.net вы можете использовать функцию Buffer.BlockCopy, которая по сути такая же, как memcpy, но работает только для примитивных типов (int, double, char, byte и т. д.).Для других типов вам нужно использовать Array.Copy.

Мой C ++ немного ржавый, но я думаю, что ваша функция C ++ в лучшем случае зависит от платформы / компилятора, когда речь идет о не примитивных типах.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...