2016-06-22 4 views
1

Entwicklung von Anwendung in C#. Net 4.5 mit Xamarin, Targeting Android. Ich habe eine benutzerdefinierte Klasse, die einige Eigenschaften enthält. Ich versuche, eine integrierte Komponente zu verwenden, die Vergleich mit Java.Util.IComparator und Java.Lang.Object durchführt. Da es sich um eine integrierte Komponente handelt, habe ich nicht viel Flexibilität, um diese beiden Elemente zu ändern.Geben Sie Cast Java-Objekt zu meiner Klasse

Meine benutzerdefinierte Klasse heißt recBatch und innerhalb davon habe ich einige Eigenschaften von ganzen Zahlen und Strings.

Hier wird die Komponente initialisiert. Er fordert im Grunde eine Methode jedes Mal, wenn der Benutzer auf den Titel klickt für Spalte 0.

tableView.SetColumnComparator(0, GetBatchIdComparator());

Dies ist die Methode, die von der Komponente

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

Und schließlich ist hier aufgerufen wird, die Klasse, die vom Aufruf zurückgegeben wird.

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


} 

Das erste, was ich oben nur versucht zu tun Gießen einen Fehler gibt mir wie hier zu sehen. Ich habe versucht, was Visual Studio vorschlägt, aber es konnte auch nicht funktionieren.

Error saying cannot cast from object to recBatch

Das nächste, was ich versuchte, war eine neue Klasse wie diese zu erstellen und die Besetzung von recBatch, meine eigentlichen Klasse auf diese neue Klasse das Casting zu tun ändern:

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; } 
} 

Mit dies, ich habe keine Fehler und kann kompilieren, aber das Problem ist, dass ich eine Cast-Ausnahme bekomme, wenn ich laufe. Der Code kompiliert und weil ich Casting bin, habe ich Zugriff auf eine der Eigenschaften in RecBatch (Batch oder RecBatch.Batch). Allerdings bekomme ich wieder eine Ausnahme. Der genaue Fehler ist:

Cast Exception

Also im Grunde, ich muss nur die java.lang.Object in recBatch werfen, aber ich denke, ich es falsch mache. Alles ist richtig verdrahtet, denn wenn ich einen Breakpoint an der Compare-Methode anlege, trifft es zu und die übergebenen lhs, rhs Argumente haben meine Klassendaten in ihnen (dh Batch), obwohl sie Java.Lang sind. Objekttypen

Jede Hilfe ist willkommen!

Danke!

+0

Versuch als primitive Datentypen/cast Dinge auf der Objekte primitiver Datentyp Ebene vergleichen –

+0

@athul Sie für die Antwort sehr viel danken, aber ich fürchte, ich verstehe nicht, Ihre Antwort. –

+0

Anstatt als Ganzes Objekt zu versuchen versuchen serialisieren und erstellen Sie ein geklontes Objekt in C# –

Antwort

3

Alles, für diejenigen, die interessiert sein könnten, habe ich eine Lösung, die an Ort und Stelle ist und ziemlich gut funktioniert. Nach einigen Hinweisen in meinen Kommentaren und einigen anderen Hinweisen brauchte ich noch einen weiteren Tag.

Im Grunde habe ich eine andere Klasse erstellt, die allein für das Umwandeln meines Java-Objekts zuständig ist. Vielleicht nicht in einer Klasse, aber naja. Hier ist die Klasse und Methode enthielt innen:

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; 
    } 
} 

Dann alles, was ich hatte, war es zu tun nennen und in dem Java-Objekt übergeben und einfach so, die lhsCopy und rhsCopy waren meine Klasse, recBatch und nicht die Java-Objekt und daher konnte ich auf alle Eigenschaften zugreifen. Ich bekomme keine Ausnahmen oder merke keine Leistungsprobleme. Wenn jedoch jemand Kommentare zu diesem Ansatz hat, fühlen Sie sich bitte frei.

Hier ist, wie ich es genannt:

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

Dank!

Mike

+0

Ich habe diese Methode für alle über das Internet gesehen, immer das gleiche, aber ich kann es nicht funktionieren, ich bekomme immer null auf 'propInfo 'irgendeine Idee warum? –

Verwandte Themen