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,我的实际类更改为这个新类以进行转换:
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。对象类型。
任何帮助表示赞赏!
谢谢!
所有,对于那些可能感兴趣的人,我有一个解决方案,该解决方案已经到位并且运行良好。在我的评论中的一些提示和其他一些线索之后,又花了一天的时间进行搜索。
基本上,我创建了另一个类,它全权负责转换我的 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)
谢谢!
麦克风
| 归档时间: |
|
| 查看次数: |
4776 次 |
| 最近记录: |