我正在尝试围绕某些本机DLL结构创建一些包装器类。这是我得到的:

public class Event // <-- managed class
{
    internal SDL_Event _event;

    public EventType Type
    {
        get { return (EventType) _event.type; }
    }

    public KeyboardEvent Key
    {
        get
        {
            return new KeyboardEvent(_event.key); // <-- I want to avoid making a copy of the struct here
        }
    }
}

[StructLayout(LayoutKind.Explicit)]
internal unsafe struct SDL_Event // <-- a union holding ~15 different event types
{
    [FieldOffset(0)] public UInt32 type;
    [FieldOffset(0)] public SDL_KeyboardEvent key;

    [FieldOffset(0)] private fixed byte _padding[56];
}

public class KeyboardEvent
{
    private SDL_KeyboardEvent _event;

    internal KeyboardEvent(SDL_KeyboardEvent e)
    {
        _event = e;
    }

    // some properties that deal specifically with SDL_KeyboardEvent
}

[StructLayout(LayoutKind.Sequential)]
internal struct SDL_KeyboardEvent
{
    public UInt32 type; // <-- sits in the same memory location as SDL_Event.type
    public UInt32 timestamp;
    public UInt32 windowID;
    public byte state;
    public byte repeat;
    private byte _padding2;
    private byte _padding3;
    public SDL_Keysym keysym;
}

[StructLayout(LayoutKind.Sequential)]
internal struct SDL_Keysym
{
    public UInt32 scancode;
    public Int32 sym;
    public UInt16 mod;
    private UInt32 _unused;
}


Event应该包装SDL_Event,而KeyboardEvent应该包装SDL_KeyboardEvent。我本质上想在访问Event时将KeyboardEvent“广播”到Event.Key,而不复制任何数据。理想情况下,Event也可以直接转换为KeyboardEvent

最佳答案

unsafe static SDL_KeyboardEvent ToSDL_KeyboardEvent (SDL_Event event)
{
    return *((SDL_KeyboardEvent*) &event);
}


这是我对结构所做的最好的工作。对于这些类,您必须以通常的方式编写一些显式的强制转换,但这应对此有所帮助。

10-08 09:08