将 Java Object 类型转换为我的类

Mic*_*ord 1 c# java android xamarin.android xamarin

使用 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);
    }


}
Run Code Online (Sandbox Code Playgroud)

我尝试通过强制转换在上面做的第一件事给了我一个错误,如下所示。我确实尝试了 Visual Studio 的建议,但也无法使其正常工作。

错误说无法从对象转换为 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

投射异常

所以基本上,我只需要将 Java.Lang.Object 转换为 recBatch 但我想我做错了。一切都正确地“连接起来”,因为如果我在比较方法上放置一个断点,它就会命中并且传入的 lhs、rhs 参数在其中包含我的类数据(即 Batch),即使它们是 Java.Lang。对象类型。

任何帮助表示赞赏!

谢谢!

Mic*_*ord 6

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

基本上,我创建了另一个类,它全权负责转换我的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我所要做的就是调用它并传入 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);
Run Code Online (Sandbox Code Playgroud)

谢谢!

麦克风