2016-06-22 12 views
1

AndroidをターゲットにしたXamarinを使用してC#.Net 4.5でアプリケーションを開発する。私はそれにいくつかのプロパティを持つカスタムクラスを持っています。私は、Java.Util.IComparatorとJava.Lang.Objectを使用して比較を行う組み込みのコンポーネントを使用しようとしています。それは組み込みのコンポーネントなので、私はこれらの2つの項目を変更する柔軟性はあまりありません。キャストJavaオブジェクトをクラスにキャスト

私のカスタムクラスはrecBatchという名前で、その内部には整数と文字列のいくつかのプロパティがあります。

コンポーネントが初期化される場所です。これは基本的にヘッダをユーザがクリックこれは、コンポーネント

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

によって呼び出されるメソッドであり、最後に、ここにある列0

tableView.SetColumnComparator(0, GetBatchIdComparator());

各時間メソッドを呼び出します呼び出しによって返されるクラス

私が上記のキャスティングで最初にやったことは、ここに見られるようなエラーです。私はVisual Studioが提案しているものを試しましたが、それを動作させることはできませんでした。

Error saying cannot cast from object to recBatch

私が試した次の事はこの1つのような新しいクラスを作成し、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)のプロパティの1つにアクセスできます。しかし、再び、私はキャストの例外を取得します。正確なエラーは次のとおりです。

Cast Exception

だから、基本的に、私はちょうどrecBatchにjava.lang.Object上位をキャストする必要がありますが、私はそれが間違ってやっていると思います。私がCompareメソッドにブレークポイントを置くとヒットし、渡されたlhs、rhs引数はJava.Langであってもそれらのクラスデータ(バッチ)を持つため、すべてが適切に「配線」されます。オブジェクトタイプ。

ご協力いただきましてありがとうございます。

ありがとうございます!

+0

は、返信いただき、誠にありがとうございますが、私は、私はあなたの応答を理解していない怖いオブジェクトのようなプリミティブなデータ型/キャスト物事プリミティブデータ型レベル –

+0

@athulを比較してみてください。 –

+0

オブジェクト全体としてキャストするのではなく、シリアル化してCでクローンオブジェクトを作成してみてください。# –

答えて

3

皆、私が興味を持っているかもしれない人たちのために、私は、これがうまくいき、とてもうまくいくという解決策を持っています。私のコメントやその他の手がかりの中でいくつかのヒントを捜したのは別の日でした。

基本的に、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 Objectであるため、すべてのプロパティにアクセスできます。私は例外を取得したり、パフォーマンス上の問題を認識しません。しかし、もし誰かがこのアプローチについてコメントしているなら、気軽にお気軽に。ここで

は、私はそれを呼ばれる方法です:

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

ありがとう!

マイク

+0

このメソッドはインターネット上では常に同じですが、動作させることはできません。propInfo 'なぜ? –

関連する問題