如何更改Xamarin Android绑定中的构造函数参数类型

如何更改Xamarin Android绑定中的构造函数参数类型,xamarin,binding,xamarin.android,Xamarin,Binding,Xamarin.android,如何编写一个绑定转换来改变构造函数参数的类型?我想在前面说明一下,我不需要以任何广泛的方式处理Java绑定,所以将此作为一个相当一般的答案。我还做了一些假设,主要是绑定java库,而不是使用已经由Xamarin团队创建了绑定的预编译Nuget包。(尽管总体方法应相同) 假设无法对方法的参数执行任何类型的运行时转换(这取决于其类型和用法)。然后,您需要查找/提取生成的Metadata.XML文件,该文件将随绑定的java库一起提供。† 该文件包含编译器将java库本机对象和类型类链接到c#等价物所

如何编写一个绑定转换来改变构造函数参数的类型?

我想在前面说明一下,我不需要以任何广泛的方式处理Java绑定,所以将此作为一个相当一般的答案。我还做了一些假设,主要是绑定java库,而不是使用已经由Xamarin团队创建了绑定的预编译Nuget包。(尽管总体方法应相同)

假设无法对方法的参数执行任何类型的运行时转换(这取决于其类型和用法)。然后,您需要查找/提取生成的Metadata.XML文件,该文件将随绑定的java库一起提供。†

该文件包含编译器将java库本机对象和类型类链接到c#等价物所需的所有绑定

Metadata.XML文件将包含如下参数:

<attr path="/api/package[@name='{package_name}']/class[@name='{name}']" name="visibility">public</attr>

至于您问题的具体内容,即参数绑定的类型更改。您可能需要在Metadata.xml文件中添加一个attr行,类似于:

<attr path="/api/package[@name='packageName']/class[@name='a']/method[@name='b']/parameter[@name='p0' and @type='String']" name="name">Classname</attr>
Classname
基本上,您定义了要调整绑定的包、类和方法名,然后使用Java库中列出的参数名设置类型

值得注意的是,绑定attr可能已经存在于Metadata.XML文件中,如果是,您应该能够调整现有条目或在其下方重新创建一个新的attr条目,该条目将创建一个带有调整后参数类型的方法重载



†我将尝试抓住这一点的确切位置,以增加更多的清晰度。

我想在这之前提出一个警告,即我不需要以任何广泛的方式处理Java绑定,因此将此作为一个相当一般的答案。我还做了一些假设,主要是绑定java库,而不是使用已经由Xamarin团队创建了绑定的预编译Nuget包。(尽管总体方法应相同)

假设无法对方法的参数执行任何类型的运行时转换(这取决于其类型和用法)。然后,您需要查找/提取生成的Metadata.XML文件,该文件将随绑定的java库一起提供。†

该文件包含编译器将java库本机对象和类型类链接到c#等价物所需的所有绑定

Metadata.XML文件将包含如下参数:

<attr path="/api/package[@name='{package_name}']/class[@name='{name}']" name="visibility">public</attr>

至于您问题的具体内容,即参数绑定的类型更改。您可能需要在Metadata.xml文件中添加一个attr行,类似于:

<attr path="/api/package[@name='packageName']/class[@name='a']/method[@name='b']/parameter[@name='p0' and @type='String']" name="name">Classname</attr>
Classname
基本上,您定义了要调整绑定的包、类和方法名,然后使用Java库中列出的参数名设置类型

值得注意的是,绑定attr可能已经存在于Metadata.XML文件中,如果是,您应该能够调整现有条目或在其下方重新创建一个新的attr条目,该条目将创建一个带有调整后参数类型的方法重载



†我将尝试获取此项的确切位置,以增加更多的清晰度。

更改构造函数参数类型的正确转换:

<attr path="/api/package[@name='com.test.test']/class[@name='TestClass']/constructor[@name='TestClass' and count(parameter)=3 and parameter[1][@type='java.lang.String'] and parameter[2][@type='java.lang.String'] and parameter[3][@type='java.lang.String']]/parameter[3]" name="managedType">Java.Lang.Object</attr>
Java.Lang.Object

基本上,一旦使用xpath找到了正确的函数,只需附加
/parameter[index of param]
更改构造函数参数类型的正确转换:

<attr path="/api/package[@name='com.test.test']/class[@name='TestClass']/constructor[@name='TestClass' and count(parameter)=3 and parameter[1][@type='java.lang.String'] and parameter[2][@type='java.lang.String'] and parameter[3][@type='java.lang.String']]/parameter[3]" name="managedType">Java.Lang.Object</attr>
Java.Lang.Object

本质上,一旦您使用xpath找到了正确的函数,只需附加
/parameter[index of param]

,您需要告诉我们到目前为止您尝试了什么,并显示您首先尝试的任何代码。理想情况下,你应该先用谷歌搜索一下这个主题。问题很简单——只是一个示例转换映射,它将展示如何在构造函数中更改类型param。我不知道你想要什么样的“谷歌”证据——我的搜索历史?只是试图帮助别人,历史上的问题并没有表明你试图解决一个问题,但却没有得到合理的建议。这就是全部。不必尖酸刻薄。感谢-1,我不知道答案一点也不尖酸刻薄。谢谢-这是新讨论的良好起点。让我们说一下关于绑定转换格式的一般问题,该格式描述了在任何java库中将构造函数参数从一种类型更改为另一种类型的操作。您需要告诉我们到目前为止您尝试了什么,并显示您首先尝试的任何代码。理想情况下,你应该先用谷歌搜索一下这个主题。问题很简单——只是一个示例转换映射,它将展示如何在构造函数中更改类型param。我不知道你想要什么样的“谷歌”证据——我的搜索历史?只是试图帮助别人,历史上的问题并没有表明你试图解决一个问题,但却没有得到合理的建议。这就是全部。不必尖酸刻薄。感谢-1,我不知道答案一点也不尖酸刻薄。谢谢-这是新讨论的良好起点。让我们谈谈关于绑定转换格式的一般问题,该格式描述了在任何java库中将构造函数参数从一种类型更改为另一种类型的操作。正如您所看到的,有几种类型的转换:可见性、名称等。我需要一种特定的转换类型的构造函数param。在方法中有几个参数类型转换的例子,但我正在努力使用构造函数。谢谢。据我所知,这应该是相同的原则,在它要求方法名的地方,您使用类的名称,这应该允许您使用ab