我正在尝试实现一种基于 Cocoa 的方法
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
问题是 void* 类型的参数。我不知道指向 void 的指针的 C# 等效项是什么。
我尝试使用"void*"进行不安全的执行,但显然这是不一样的。我也尝试了简单的"void",但 C# 编译器声称 void 不能用作参数类型。
有什么想法吗?
Error CS0123: A method or delegate `MyProgram.MainWindow.alertDidEnd(MonoMac.AppKit.NSAlert, int, MonoMac.Foundation.NSObject)' parameters do not match delegate `MonoMac.Foundation.NSAction()' parameters (CS0123)
更新(问题解决后):
这些是完成此操作的调用和方法:
alert.BeginSheet ((NSWindow)sender, this, new Selector ("alertDidEnd:returnCode:contextInfo:"), IntPtr.Zero);
[Export("alertDidEnd:returnCode:contextInfo:")]
public void alertDidEnd (NSAlert alert, int result, IntPtr ci)
{}
第一个是显示附加到窗口的警报,第二个是消除警报时调用的函数的方法声明。结果存储在 int 结果中。
void* 映射到 .net 中的 IntPtr:
[Export("alertDidEnd:returnCode:contextInfo:")]
public void alertDidEnd (NSAlert alert, int returnCode, IntPtr contextInfo)
{
Console.WriteLine (returnCode);
}
你可以看看这里的工作示例:
https://github.com/picoe/Eto/blob/master/Source/Eto.Platform.Mac/Forms/MacModal.cs
此外,从您的错误消息来看,您应该只对使用它的任何内容使用普通的无参数方法。 NSAction 是一个没有参数的委托。
可以将该方法定义为:
[Export("alertDidEnd:returnCode:contextInfo:")]
public void alertDidEnd (NSAlert alert, int returnCode, NSObject contextInfo)
{
Console.WriteLine (returnCode);
}
void *
指针将包装到 NSObject 中。