2017-06-26 4 views
1
{"Score":"1851","HistoryScore":"3149","TotalScore":"3149","TotalTopic":"289"} 

Bild haben ein über jsonJtoken werfen Fehler

int i = (int)x["Score"] 

das ist in Ordnung, und i = 1851 bis int;

Wenn eine Erweiterungsmethode hat als nächste

public static T As<T>(this object @this) 
{ 
    return (T) @this; 
} 
x["Score"].as<int>();` 
// this will get error why? System.InvalidCastException 
+0

Es ist schon [ 'JToken.ToObject ()'] (http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JToken_ToObject__1. htm). – dbc

Antwort

1

Die Bibliothek implementiert explizite Umwandlungsoperatoren; Mit dieser Option können Sie JToken an int senden, ohne einen Fehler zu erhalten.

Ihre Erweiterung jedoch wirft zunächst die JToken zu einem object und dann zu int Gießen. Da es keine explizite Konvertierung von object zu int gibt, erhalten Sie eine Ausnahme.

Warum die Erweiterung nicht wie folgt definieren:

public static T As<T>(this JToken @this) 
{ 
    return (T)Convert.ChangeType(@this, typeof(T)); 
} 
+0

Danke, warum nicht direkt 'return (T) @this;' gibt es einen Unterschied – lsl

+0

@Isl Ja, Sie erhalten einen Compilerfehler; da es nicht ausschließen kann, dass irgendein 'JToken' sicher in' T' umgewandelt werden kann. – Rob

+0

Sie können das auch auf 'this object @ this' ändern, da es nicht spezifisch für' JToken' ist – Evk