Как вы можете конвертировать void * в определенный тип в C #? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть серия классов, каждый из которых построен для определенного типа (Byte, UInt16, Double и т. Д .; каждый определяется как TypeCode).Каждый класс имеет почти одинаковый код, но делает некоторые приведения к его определенному типу.Примечание: есть член класса, определенный как: void* _baseAddress; и ClassX* _table;

Упрощенный пример метода:

    public unsafe UInt16 GetValue(int x)
    {
        return *((UInt16*) _baseAddress + (_table+ x)->entry);
    }

Я хочу, предполагая, что у меня есть член класса с именем MyTypeкоторый определяется typeof(inputType), для этого:

    public unsafe object GetValue(int x)
    {
        return *((MyType*) _baseAddress + (_table+ x)->entry);
    }

Это явно не работает.Я пытался прочитать об использовании Func и delegates, но продолжал бить стену, в которой пустота * не может быть преобразована так, как я хочу.

Потому что я думаю, что это добавляет контекст.Это пытается получить значение в данном месте.У меня есть метод зеркалирования, который должен иметь:

*((MyType*) _baseAddress + (_table + x)->XEntry ) = inputValue;

Примечание: производительность важна.Я не могу выделить новую память, и при этом не могу сжечь кучу процессорного времени на преобразования

1 Ответ

0 голосов
/ 21 декабря 2018

Если я правильно понимаю вашу проблему, это выполнит то, что вы хотите:

    /// <summary>
    /// Maps the supplied byte array onto a structure of the specified type.
    /// </summary>
    public static T ToStructure<T>(byte[] data)
    {
        unsafe
        {
            fixed (byte* p = &data[0])
            {
                return (T)Marshal.PtrToStructure(new IntPtr(p), typeof(T));
            }
        };
    }

Что демонстрирует принцип.Вы должны иметь возможность адаптировать его к вашим конкретным целям.

Эта функция выполняет обратную операцию:

    /// <summary>
    /// Converts the supplied object to a byte array.
    /// </summary>
    public static byte[] ToByteArray(object obj)
    {
        int len = Marshal.SizeOf(obj);
        byte[] arr = new byte[len];
        IntPtr ptr = Marshal.AllocHGlobal(len);
        Marshal.StructureToPtr(obj, ptr, true);
        Marshal.Copy(ptr, arr, 0, len);
        Marshal.FreeHGlobal(ptr);
        return arr;
    }

Marshal в System.Runtime.InteropServices.

Есливам нужна максимально быстрая скорость, посмотрите здесь .

Вы также должны взглянуть на BitConverter класс.

...