Xamarin:没有getXXX()/ setXXX()的公共字段在绑定jar lib时丢失了它的泛型

时间:2014-05-22 03:39:17

标签: jar xamarin

在jar中:

public List<CloudPoiInfo> poiList;

但是Xamarin生成的代码为System.Collections.IList poiList System.Collections.Generic.IList<Com.Baidu.Mapapi.Cloud.CloudPoiInfo> myClassList是对的。

我试过

<attr path="/api/package[@name='com.baidu.mapapi.cloud']/class/field[@type-generic-aware='java.util.List&lt;com.baidu.mapapi.cloud.CloudPoiInfo&gt;']" name="type">System.Collections.Generic.IList&lt;Com.Baidu.Mapapi.Cloud.CloudPoiInfo&gt;</attr>

2 个答案:

答案 0 :(得分:1)

我已修好它:

metadata.xml中

<remove-node path="/api/package[@name='com.baidu.mapapi.cloud']/class[@name='CloudSearchResult']/field[@name='poiList']"/>

(项目)/Additions/CloudSearchResult.cs

using Android.Runtime;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Com.Baidu.Mapapi.Cloud
{
    public partial class CloudSearchResult : BaseSearchResult
    {
    static IntPtr poiList_jfieldId;

    // Metadata.xml XPath field reference: path="/api/package[@name='com.baidu.mapapi.cloud']/class[@name='CloudSearchResult']/field[@name='poiList']"
    [Register("poiList")]
    public global::System.Collections.Generic.IList<CloudPoiInfo> PoiListX
    {
        get
        {
        if (poiList_jfieldId == IntPtr.Zero)
            poiList_jfieldId = JNIEnv.GetFieldID(class_ref_2, "poiList", "Ljava/util/List;");
        IntPtr __ret = JNIEnv.GetObjectField(Handle, poiList_jfieldId);
        return global::Android.Runtime.JavaList<CloudPoiInfo>.FromJniHandle(__ret, JniHandleOwnership.TransferLocalRef);
        }
        set
        {
        if (poiList_jfieldId == IntPtr.Zero)
            poiList_jfieldId = JNIEnv.GetFieldID(class_ref_2, "poiList", "Ljava/util/List;");
        IntPtr native_value = global::Android.Runtime.JavaList<CloudPoiInfo>.ToLocalJniHandle(value);
        JNIEnv.SetField(Handle, poiList_jfieldId, native_value);
        JNIEnv.DeleteLocalRef(native_value);
        }
    }

    internal static new IntPtr java_class_handle_2;
    internal static new IntPtr class_ref_2
    {
        get
        {
        return JNIEnv.FindClass("com/baidu/mapapi/cloud/CloudSearchResult", ref java_class_handle_2);
        }
    }
    }

    public abstract partial class BaseSearchResult : Java.Lang.Object
    {
    }

    public partial class CloudPoiInfo : Java.Lang.Object
    {
    }
}

答案 1 :(得分:0)

Java和C#中的泛型非常不同,因此没有泛型的IList实际上是正确的。这是由于Java端的类型擦除。

http://en.wikipedia.org/wiki/Generics_in_Java

  

在编译时检查泛型的类型正确性。通用的   然后在称为类型擦除的过程中删除类型信息。对于   例如,List将转换为非泛型类型List,   通常包含任意对象。编译时检查   保证生成的代码是类型正确的。

     

在类型擦除之后,无法确定类型参数   运行。例如,在运行时检查ArrayList时   不是一般的方法来确定在类型擦除之前它是否是一个   ArrayList或ArrayList。