当使用Xamarin创建Java Bindings项目以便可以通过C#引用Android Java jar时,如何仅覆盖生成的C#?
我遇到绑定生成后的错误,好像通过使用显式转换而不是生成使用JavaCast实用程序来轻松修复它。我不知道如何告诉Xamarin绑定生成器跳过这个方法生成而不完全排除它。
我已经尝试在Additions文件夹和一般项目中的库绑定项目中包含重写的方法,但是当我这样做时我收到的错误表明该类型已经定义了具有相同参数类型的成员,所以它识别它,但不是在生成绑定之前。
我意识到我可以生成绑定一次,对生成的文件进行修改并尝试确保库绑定项目永远不会再生成,但我想避免维护成本或生成的检入文件。这是一个完整的最后手段。
Java代码:
public interface IUpdateListener<T> {
public void onUpdate(T data);
}
...
// This method is explicitly implemented as a member of an instantiated x.y.z.IUpdateListener
private class UpdateListener implements IUpdateListener<byte[]> {
@Override
public void onUpdate(byte[] data) {
//Does some stuff
}
}
生成的Xamarin生成了C#代码:
void global::x.y.z.IUpdateListener.OnUpdate (global::Java.Lang.Object p0)
{
// This line has an error with the call to JavaCast
OnUpdate (global::Java.Interop.JavaObjectExtensions.JavaCast<byte[]>(p0));
}
生成的行错误:
Error 362 The type 'byte[]' cannot be used as type parameter 'TResult' in the generic type or method 'Java.Interop.JavaObjectExtensions.JavaCast<TResult>(Android.Runtime.IJavaObject)'. There is no implicit reference conversion from 'byte[]' to 'Android.Runtime.IJavaObject'.
警告 - 我们正在消耗jar,而不是生产它们,因此我根本无法更改Java代码。
感谢您的帮助!
更新11/10: 我遇到的问题确认了一个错误购买Xamarin,可以在这里找到:https://bugzilla.xamarin.com/show_bug.cgi?id=24312
我的工作是https://gist.github.com/rob-derosa/61429e8967faf263e635#file-gistfile1-xml
当我将工作添加到我的元数据文件中时,我得到一个更易于管理的错误,指出那些使用byte []实现does not implement interface member 'foo.bar.IUpdateListener.OnUpdate(Java.Lang.Object)'
更新的类,这是非常期望的,因为它们没有。
然后,我可以在additions文件夹中创建实现OnUpdate(Java.Lang.Object)
方法的部分类,并执行显式转换,并从实际代码调用生成的OnUpdate。此方法没有错误或警告。
我认为实际上没有一种方法可以实现生成代码的实际覆盖,但我能够解决问题,提示原始问题。