2

いくつかのネイティブ 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したいと考えています。理想的には、直接キャスト可能でもあります。KeyboardEventEvent.KeyEventKeyboardEvent

4

1 に答える 1

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

それが構造体でできる最善のことです。クラスについては、通常の方法でいくつかの明示的なキャストを記述する必要がありますが、これはそれらに役立つはずです。

于 2013-07-15T03:09:20.817 に答える