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

时间:2018-02-15 12:44:52

标签: xamarin binding xamarin.android

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

2 个答案:

答案 0 :(得分:1)

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

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

基本上,一旦你用xpath找到了正确的函数,只需追加/parameter[index-of-param]

答案 1 :(得分:0)

我想在此之前加上警告,我不需要以任何广泛的方式搞乱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>

经过一些研究后,我发现以下有用的链接有助于解释这些语句的语法:

Jon Douglas - "Approaching a Xamarin.Android Bindings Case"

Xamarin Documentation - "Customizing Bindings"

Xamarin Documentation - "Java Bindings Metadata"

关于你的问题的具体细节,即参数绑定的类型改变。您可能需要在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>

基本上,您定义要调整绑定的包,类和方法名称,然后使用Java库中列出的参数名称,只需设置类型即可。

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

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