使用ExportAttribute实现非正式协议时如何调用父类方法?
在Xamarin.Mac中实现
cancelOperation:并调用父类逻辑 我需要把以下Swift代码的功能在Xamarin.Mac中实现:
class MyTableView : NSTableView { override func cancelOperation(_ sender: Any?) { // 自定义处理逻辑 super.cancelOperation(sender) // 后续自定义处理逻辑 } }
遇到的问题
C#中的NSTableView并未实现cancelOperation:方法(该方法属于AppKit的NSStandardKeyBindingResponding非正式协议),因此没有可直接重写的成员。
我尝试在NSTableView子类中通过直接导出的方式处理该消息:
[Export("cancelOperation:")] private void CancelOperation(NSObject? sender) { // 自定义处理逻辑 System.Diagnostics.Debug.WriteLine("Custom processing"); // 无法编译 //base.CancelOperation(sender); // 调用后导致应用崩溃 objc_msgSendSuper(this.SuperHandle, Selector.GetHandle("cancelOperation:"), sender?.Handle ?? NativeHandle.Zero); // 后续自定义处理逻辑 System.Diagnostics.Debug.WriteLine("another part of custom processing"); } [DllImport ("/usr/lib/libobjc.dylib", EntryPoint = "objc_msgSend")] private static extern void objc_msgSendSuper(NativeHandle superReceiver, NativeHandle selector, NativeHandle value);
现在的核心问题是:无法像Swift代码那样直接调用父类的cancelOperation:实现。因为这不是重写成员而是导出的方法,没法写base.CancelOperation(sender);而用objc_msgSendSuper的方式又会导致应用崩溃。
我想知道:如何为cancelOperation:(或其他非正式协议成员)实现自定义处理,同时正确调用父类的实现?
内容的提问来源于stack exchange,提问作者Serg
相关产品推荐
相关产品推荐

