【问题标题】:How to change constructor param type in Xamarin Android bindings如何在 Xamarin Android 绑定中更改构造函数参数类型
【发布时间】:2018-07-26 05:35:46
【问题描述】:

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

【问题讨论】:

  • 您需要告诉我们到目前为止您已经尝试过什么,并首先显示您尝试过的任何代码。理想情况下,表明您首先围绕该主题进行了一些谷歌搜索。
  • 这个问题相当简单——只是一个示例转换映射,它将展示如何在构造函数中更改类型参数。我不知道你想要什么样的“谷歌搜索”证据 - 我的搜索历史?
  • 只是想提供帮助,从历史上看,没有显示解决问题的尝试的问题无法获得体面的建议。就这样。无需刻薄。
  • 感谢-1,不知道答案一点也不刻薄。
  • 谢谢 - 这是新讨论的良好起点。让我们说一下关于绑定转换格式的一般问题,该格式描述了在任何 Java 库中将构造函数参数从一种类型更改为另一种类型的操作。

标签: xamarin binding xamarin.android


【解决方案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]

【讨论】:

    【解决方案2】:

    我想先声明一下,我不需要以任何广泛的方式来处理 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 条目,该条目应该使用调整后的方法创建方法重载参数类型....


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

    【讨论】:

    • 感谢您的精彩文章。正如您所看到的,有几种类型的转换:可见性、名称等。我要求一个特定的转换——改变构造函数参数的类型。方法中有几个参数类型转换的例子,但我正在努力使用构造函数。
    • 谢谢。据我所知,它应该是相同的原则,只是它要求您使用类名称的方法名称,这应该允许您调整构造函数绑定。
    • 我明天试试,然后回复答案。
    • 它会抛出任何类型的编译异常,还是看起来绑定但没有给你新的参数类型?
    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2012-09-22
    相关资源
    最近更新 更多