【问题标题】:Type cast Java Object to my class将 Java 对象类型转换为我的类
【发布时间】:2016-06-22 00:03:27
【问题描述】:

使用 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 的建议,但也无法正常工作。

接下来我尝试创建一个像这样的新类并将演员表从我的实际班级 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)。但是,我再次遇到演员表异常。确切的错误是:

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

感谢任何帮助!

谢谢!

【问题讨论】:

  • 尝试作为原始数据类型进行比较/在对象原始数据类型级别进行转换
  • @athul 非常感谢您的回复,但恐怕我不明白您的回复。
  • 尝试序列化并在 C# 中创建一个克隆对象,而不是作为一个整体对象进行转换

标签: java c# android xamarin xamarin.android


【解决方案1】:

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

基本上,我创建了另一个单独负责转换我的 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 对象,因此我可以访问所有属性。我没有发现任何异常或注意到任何性能问题。但是,如果有人对这种方法有一些 cmets,请随意。

我是这样称呼它的:

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

谢谢!

迈克

【讨论】:

  • 我在整个互联网上都看到过这种方法,总是一样,但我不能让它工作,我总是在propInfo 上得到空值,知道为什么吗?
  • 您是否添加了任何特定的 Java using 语句?我收到“找不到类型或命名空间‘Java’”错误。还有 recBatch 是什么类型的?
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多