いくつかのネイティブ 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