Xamarin iOS 首先缺少 EventArgs 属性

Xamarin iOS EventArgs missing first property

在委托方法上使用 EventArgs 属性时,它会生成事件处理程序 class,其属性基于除第一个参数之外的方法参数。

生成的事件参数中缺少第一个参数 class。

例如:

[Protocol, Model]
[BaseType(typeof(NSObject))]
public interface TestDelegate
{
    // @required -(void)DidReceiveFrom:(NSString * _Nonnull)p1 withP2:(NSString * _Nonnull)p2 withP3:(NSString * _Nonnull)p3 withP4:(NSString * _Nonnull)p4;
    [Abstract]
    [Export("DidReceiveFrom:withP2:withP3:withP4:")]
    [EventArgs("DidReceiveFrom")]
    void DidReceiveFrom(string p1, string p2, string p3, string p4);

那么生成的EventArgsclass就变成了:

//
// EventArgs classes
//
public partial class DidReceiveFromEventArgs : EventArgs {
    public DidReceiveFromEventArgs (string p2, string p3, string p4)
    {
        this.p2 = p2;
        this.p3 = p3;
        this.p4 = p4;
    }
    public string p2 { get; set; }
    public string p3 { get; set; }
    public string p4 { get; set; }
}

所以它肯定缺少 p1 属性。如何避免这种行为?

我猜您正在使用 objective sharpie 工具为 Objective C API.

生成 C# 代码

如果是这样,那么,基本上您需要记住它是一个辅助工具,但不能 100% 保证它会为您获取正确的 C# 代码。

无论如何,最简单的解决方法是手动编辑 C# 代码,如果您遗漏了这个参数,请添加它。

您没有显示 TestDelegate 的 C# 代码。可能是您将第一个参数作为发送者,然后所有 3 个其他参数作为事件参数?

如果是这种情况,请在 C# API 中注释 [EventArgs("DidReceiveFrom")] 属性并重新编译绑定。

根据 Xamarin 文档,此行为默认为:

For events that take more than one parameter (in Objective-C the convention is that the first parameter in a delegate class is the instance of the sender object) you must provide the name that you would like for the generated EventArgs class to be. This is done with the EventArgs attribute on the method declaration in your Model class.

https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#EventArgsAttribute

我为其生成绑定的源库中的委托似乎没有严格遵守此规则,第一个参数是字符串形式的半发送者。