Xamarin iOS EventArgs缺少第一个属性

Xamarin iOS EventArgs缺少第一个属性,xamarin,binding,xamarin.ios,eventargs,Xamarin,Binding,Xamarin.ios,Eventargs,在委托方法上使用EventArgs属性时,它会生成事件处理程序类,该类的属性基于除第一个参数之外的方法参数 生成的事件args类中缺少第一个参数 例如: [Protocol, Model] [BaseType(typeof(NSObject))] public interface TestDelegate { // @required -(void)DidReceiveFrom:(NSString * _Nonnull)p1 withP2:(NSString * _Nonnull)p2

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

生成的事件args类中缺少第一个参数

例如:

[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);
然后生成的EventArgs类变为:

//
// 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”)]
属性并重新编译绑定。

我猜您正在使用
objective sharpie
工具为目标C API生成C#代码

如果是这样的话,那么基本上你需要记住它是一个帮助工具,但不是100%保证它能为你得到正确的C代码

不管怎样,最简单的修复方法是手动编辑C代码,如果没有找到,则添加此参数

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


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

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

对于包含多个参数的事件(在Objective-C中,约定是委托类中的第一个参数是发送方对象的实例),必须提供生成的EventArgs类所需的名称。这是通过模型类中方法声明的EventArgs属性完成的


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

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

对于包含多个参数的事件(在Objective-C中,约定是委托类中的第一个参数是发送方对象的实例),必须提供生成的EventArgs类所需的名称。这是通过模型类中方法声明的EventArgs属性完成的


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

这是iOS绑定项目,因此将从上述示例代码生成C#委托代码。我无法编辑委托以使用或不使用发件人作为第一个参数。我只想使用C#events并在EventArgs类中包含所有参数,那么发送方应该包含真正的发送方对象,而不是第一个事件args属性。@awattar您是编写此C#代码还是从objc文件生成的?代码是由sharpie工具生成的,但我添加了EventArgs属性,因为我想使用C#events而不是strong或软弱的代表。除了绑定库EventArgs类中缺少从委托方法生成的第一个属性外,其他一切都正常。@awattar如果编写了EventArgs,为什么不将p1添加到类定义中?我只在绑定项目中的sharpie生成的委托方法上编写了EventArgs属性。然后绑定项目生成错误的EventArgs类,缺少第一个属性。这是iOS绑定项目,因此将从上述示例代码生成C#委托代码。我无法编辑委托以使用或不使用发件人作为第一个参数。我只想使用C#events并在EventArgs类中包含所有参数,那么发送方应该包含真正的发送方对象,而不是第一个事件args属性。@awattar您是编写此C#代码还是从objc文件生成的?代码是由sharpie工具生成的,但我添加了EventArgs属性,因为我想使用C#events而不是strong或软弱的代表。除了绑定库EventArgs类中缺少从委托方法生成的第一个属性外,其他一切都正常。@awattar如果编写了EventArgs,为什么不将p1添加到类定义中?我只在绑定项目中的sharpie生成的委托方法上编写了EventArgs属性。然后绑定项目生成错误的EventArgs类,缺少第一个属性。