ref
我正在围绕一些 C 代码编写一个包装器,如果不能在 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
. 但是,C 期望一个指向SDL_Event
not 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
在 lambda 中使用关键字,但我不确定如何绕过它。
我可以定义一个常规的辅助方法而不是使用 lambda,但是我需要在其中使用局部filter
变量,而且我不知道如何在不更改签名的情况下将其放入函数中(那么它就不会匹配SDL_EventFilter
) .
在 JavaScript、PHP 或 Python 中,我可以构造一个可调用对象,创建filter
一个成员变量,然后将该对象用作回调。我不确定C#中是否有类似的概念,有吗?