错误CS0115:在Xamarin绑定库项目中找不到合适的方法来覆盖

cetgtptt  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(132)

我创建了一个bindings library项目来运行一个Android.aar文件。我得到的几个错误之一是:

Error  CS0115  'Call.OnWarning(IDictionary)': no suitable method found to override TwilioBindings  C:\...\TwilioBindings\obj\Debug\generated\src\Com.Twilio.Voice.Call.cs;

为了解决这个问题,我验证了 API.xml,发现方法 onWarning 有一个类型为 java.util.HashMap 的参数:

<method abstract="false" deprecated="not deprecated" final="false" name="onWarning" native="false" return="void" static="false" synchronized="false" visibility="public">
    <parameter name="p0" type="java.util.HashMap">
    </parameter>
</method>

Call 正在扩展 InternalCall,它实现了 RTCMonitorCommand.Listener,在我检查了 API.xml 文件后,我注意到方法 onWarning 具有以下定义:

  • 内部电话 *:
<method abstract="false" deprecated="not deprecated" final="false" name="onWarning" native="false" return="void" static="false" synchronized="false" visibility="public">
    <parameter name="warningDetails" type="java.util.HashMap&lt;java.lang.String, java.lang.Object&gt;">
    </parameter>
</method>
  • RTCMonitorCommand.Listener*:
<method abstract="true" deprecated="not deprecated" final="false" name="onWarning" native="false" return="void" static="false" synchronized="false" visibility="public">
    <parameter name="p0" type="java.util.HashMap&lt;java.lang.String, java.lang.Object&gt;">
    </parameter>
</method>

所以我得出的结论是,只有类 Call 具有不同的参数类型。
因此,我在 Metadata.xml 中编写了以下代码,以更改类 Call 中方法 onWarning 的参数类型:

<attr path="/api/package[@name='com.twilio.voice']/class[@name='Call']/method[@name='onWarning' and count(parameter)=1 and parameter[1][@type='java.util.HashMap']]/parameter[1]" name="type">java.util.HashMap&lt;java.lang.String, java.lang.Object&gt;</attr>

错误消失了,但我在使用这个绑定项目时遇到了一些问题,这是 * Metadata.xml * 中的一行,我不确定这是正确的。
有谁知道我的做法是否正确?
任何帮助都是感激不尽的,
谢谢大家。

2guxujil

2guxujil1#

当我从这个绑定库中调用一个方法的时候,我遇到了一些问题,我认为这是由一些绑定错误引起的,但是在搜索日志后,我得出的结论是,问题是库无法找到依赖项。依赖项项目被绑定项目引用,但不知何故引用不起作用。所以我改变了引用,而不是引用包,我引用了包dll,现在它正常工作。

8ftvxx2r

8ftvxx2r2#

对于遇到此错误的未来用户。我有2个导致此问题的情况,并为他们修复如下:

场景一:

在通过metadata.xml实现接口成员以修复错误 "[className] does not implement interface member [memberName]" 后收到 “no suitable method found to override”。我的[className]是DefaultTimerBar,我的接口成员名称是ITimeBar.SetEnabled(bool)

<!--Fixes The following metadata change will resolve "[className] does not implement interface member [memberName]",
  however it will now give the error "DefaultTimeBar.SetEnabled(bool): no suitable method found to override"-->

  <add-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='DefaultTimeBar']">
    <method name="setEnabled" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public">
      <parameter name="p0" type="boolean"/>
    </method>
  </add-node>

  <!--The fix for this scenario was to change the name of the method from "setEnabled" to "SetEnabled". This resolved both errors-->
  <add-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='DefaultTimeBar']">
    <method name="SetEnabled" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public">
      <parameter name="p0" type="boolean"/>
    </method>
  </add-node>

我怀疑当接口成员命名为“getX()”或“setX()”时,编译器会将其视为get/set属性。在上面的setEnabled(bool)的情况下,当方法名称属性为小写时,该方法将被实现为override。随后产生错误:* 没有找到合适的方法来覆盖 *。当更改为大写时,它将正确地实现为virtual。我的推理是由于当方法名称不在.aar文件中以get/set开始时,不会发生相同的行为。

场景二:

错误 *[className].[methodName]:没有找到合适的方法来覆盖 * received,而没有为特定方法进行先前的元数据转换。我的方法名为SetFullScreen(bool),所以我假设这是由于编译器错误地将其视为getter/setter的相同问题。我的解决方案是删除该方法,然后重新添加方法,名称的前导字母大写。我只是从api中复制了方法的详细信息。绑定项目目录obj\Debug\api.xml中的xml文件。

<remove-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='VideoPlayerViewExo']/method[@name='setFullScreen' and count(parameter)=1 and parameter[1][@type='boolean']]"/>

  <add-node path="/api/package[@name='com.mycompany.mypackage']/class[@name='VideoPlayerViewExo']">
    <method abstract="false" deprecated="not deprecated" final="false" name="SetFullScreen" jni-signature="(Z)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
      <parameter name="fullscreen" type="boolean" jni-type="Z">
      </parameter>
    </method>
  </add-node>

相关问题