2016-06-09 5 views
-1

Ich erhalte eine Datentabelle aus einer WCF-Funktion WebMessageFormat = Json und dann die Eigenschaften meines Datenvertrags mit Betrachtung. Ich erhalte die folgende Fehlermeldung auf einem int Feld -Konvertieren von Daten aus wcf mit Reflection Objekt vom Typ 'System.Int64' kann nicht in Typ 'System.Int32' konvertiert werden

Objekt des Typs ‚System.Int64‘ kann nicht auf den Typ System.Int32 umgewandelt werden‘

Kann jemand erklären, was das ist und wie man Adresse?

+2

Sicher ... Sie können 64-Bit-Ganzzahl nicht in 32-Bit-Ganzzahl passen. Es gibt nicht genug Platz, um den Wert auszudrücken. Der Maximalwert von Int64 ist 9.223.372.036.854.775.807, während das Maximum für Int32 viel kleiner ist - 2.147.483.647 – Alex

Antwort

1

Beim Eingeben von Werten in Boxed-Werte müssen Sie in den richtigen Typ umwandeln. Zum Beispiel:

var myLong = (object)42L; 

var intValue = (int)myLong; // WRONG - myLong is a boxed long, not int 
var intValue2 = (int)(long)myLong; // CORRECT - myLong is unboxed first, then converted 

Beachten Sie, dass Sie ein OverflowException wenn int bekommen kann, ist nicht groß genug, um Ihren long Wert sogar enthalten, wenn Sie den Wert korrekt unbox.

+1

Bedeutet dies, dass im Gegensatz zu allen anderen Feldern, wenn das Feld ein int ist, ich immer zuerst von Long konvertieren muss? Also für alle Felder kann ich nur var value = row.Field (property.Name); property.SetValue (Vertrag, Wert! = DBNull.Value? Wert: null, null); aber jetzt muss ich erst den Feldtyp überprüfen? Gibt es eine Möglichkeit, dies zu umgehen? –

+0

@MikeTurner Wenn das Feld ein Werttyp ist, müssen Sie immer auf genau den gleichen Typ umwandeln, eine der Schnittstellen, die es implementiert, oder "object" (nicht 100% wahr, aber nah genug für die meisten Zwecke). Es spielt keine Rolle, ob es "int" oder "DBNull" ist, aber beide Seiten müssen vom selben Typ sein - es gibt keinen Unterschied zwischen dem Umsetzen eines Kastens "int" in "long" und das gleiche mit z. 'DBNull'. 'dynamic' erlaubt es, die explizite Typprüfung zu vermeiden (' (int) (dynamic) (object) value funktioniert, wenn '(int) value'), kann aber andere Konsequenzen haben - vergewissern Sie sich, dass Sie' dynamic' verstehen 'funktioniert, wenn Sie diese Route gehen. – Luaan

+0

Was ist seltsam ist, dass ich Ints zuvor zurückgegeben habe und noch nie in dieses Problem gelaufen ist, gibt es eine Möglichkeit, ich kann meine WCF-Funktion Int32 anstelle von int64 zurückgeben? Ich bin verwirrt darüber, warum dies plötzlich auftauchte, als ich meiner Funktion ein int-Feld hinzufügte? –

Verwandte Themen