我正在尝试围绕某些本机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);
}
这是我对结构所做的最好的工作。对于这些类,您必须以通常的方式编写一些显式的强制转换,但这应对此有所帮助。