私はいくつかの C コードのラッパーを書いていますがref
、 lambda でキーワードを使用できなければ、このビットを記述する方法がよくわかりません。
アンマネージ関数ラッパーは次のようになります。
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate int SDL_EventFilter(ref object userData, ref SDL_Event @event);
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_AddEventWatch")]
internal static extern void SDL_AddEventWatch(SDL_EventFilter filter, ref object userData);
しかし、私は直接使いたくないSDL_Event
(複雑な構造体です) ので、独自のクラスでラップしましたEvent
。SDL_Event
ただし、C は非 anへのポインターを想定しているEvent
ため、すべてをまとめるためにさらにコードを作成する必要があります。
public delegate void EventFilter(object userData, Event @event);
public static void AddEventWatch(EventFilter filter, object userData)
{
SDL_AddEventWatch((ref data, ref e) => // <-- can't do this
{
filter(data, new Event(ref e));
return 0;
}, ref userData);
}
これは基本的に、与えられた を受け取り、それをクラスSDL_Event
に変換します。Event
ただし、ref
ラムダ内でキーワードを使用することはできませんが、それを回避する方法がわかりません。
ラムダを使用する代わりに通常のヘルパー メソッドを定義することもできますが、そのfilter
内部でローカル変数を使用する必要があり、署名を変更せずにそれを関数に取り込む方法がわかりません (その場合、一致しませんSDL_EventFilter
) 。 .
JavaScript、PHP、または Python では、呼び出し可能なオブジェクトを構築しfilter
、メンバー変数を作成して、そのオブジェクトをコールバックとして使用できます。C# に同様の概念があるかどうかはわかりませんが、ありますか?