You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:45:28