在我的类中输入强制转换Java对象

时间:2016-06-22 00:03:27

标签: java c# android xamarin xamarin.android

使用Xamarin在C#.Net 4.5中开发应用程序,面向Android。我有一个自定义类,其中包含一些属性。我正在尝试使用内置组件,使用Java.Util.IComparator和Java.Lang.Object进行比较。因为它是内置组件,所以我没有太多灵活性来更改这两个项目。

我的自定义类名为recBatch,在其中,我有一些整数和字符串属性。

这是组件初始化的地方。每次用户点击第0列的标题时,它基本上都会调用一个方法。

tableView.SetColumnComparator(0, GetBatchIdComparator());

这是组件调用的方法

public Java.Util.IComparator GetBatchIdComparator() { return new BatchIdComparator(); }

最后,这是调用返回的类。

public class BatchIdComparator : Java.Lang.Object, Java.Util.IComparator
{


    public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
    {
        var leftID = (recBatch)lhs;
        var rightID = (recBatch)rhs;

        return leftID.Batch.CompareTo(rightID.Batch);
    }


}

我在上面尝试做的第一件事就是给我一个错误。我确实尝试过Visual Studio的建议,但也无法使其工作。

Error saying cannot cast from object to recBatch

我接下来尝试的是创建一个像这样的新类,并将recBatch,我的实际类转换为这个新类来进行转换:

 public class BatchIdComparator : Java.Lang.Object, Java.Util.IComparator

 {


    public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
    {
        var leftID = (castClass)lhs;
        var rightID = (castClass)rhs;

        return leftID.BatchData.Batch.CompareTo(rightID.BatchData.Batch);
    }


}

public class castClass : Java.Lang.Object
{
    public castClass(recBatch batchData)
    {
        batchData = BatchData;
    }

    public recBatch BatchData { get; private set; }
}

有了这个,我没有错误并且可以编译,但问题是我在运行时遇到强制转换异常。代码确实编译,因为我正在进行编译,我可以访问recBatch中的一个属性(Batch或recBatch.Batch)。然而,再次,我得到一个演员异常。确切的错误是:

Cast Exception

基本上,我只需要将Java.Lang.Object强制转换为recBatch,但我想我做错了。所有东西都正确“连接”,因为如果我在Compare方法中设置了一个断点,它确实会命中并传入的lhs,rhs参数中包含我的类数据(即批处理),即使它们是Java.Lang。对象类型。

感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:4)

所有,对于那些可能感兴趣的人,我有一个解决方案,这个到位并且运作良好。经过我的评论和其他一些线索后,我又花了一天的时间进行搜索。

基本上,我创建了另一个独立负责转换Java对象的类。可能没必要在课堂上这样做但是哦。这是包含在其中的类和方法:

public class CastJavaObject
{
    public static T Cast<T>(Java.Lang.Object obj) where T : recBatch
    {
        var propInfo = obj.GetType().GetProperty("Instance");
        return propInfo == null ? null : propInfo.GetValue(obj, null) as T;
    }
}

然后,我所要做的就是调用它并传入Java对象,就像那样,lhsCopy和rhsCopy属于我的类,recBatch而不是Java对象,因此,我可以访问所有属性。我没有任何例外或发现任何性能问题。但是,如果有人对此方法有一些评论,请随意。

以下是我打电话的方式:

    public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
    {
        var lhsCopy = CastJavaObject.Cast<recBatch>(lhs);
        var rhsCopy = CastJavaObject.Cast<recBatch>(rhs);

谢谢!

麦克