2016-06-04 4 views
0

Ich habe eine Rückruf-Webmethode, die Facebook anruft. Unglücklicherweise wird der Zweck des Aufrufs, der diese einzelne URL verwendet, ausschließlich durch die Struktur des Objekts (Json) bestimmt, das in dem Post-Body übergeben wird. Im Moment denke ich an:Gibt es eine effizientere Syntax für mehrere Versuche/Catch?

try { Class1 obj1 = JsonConvert.DeserializeObject<Class1>(rawData); 
     //code to run if data is of Class1 ... 
    } 
catch 
{ try { Class2 obj2 = JsonConvert.DeserializeObject<Class2>(rawData); 
     //code to run if data is of Class2 ... 
     } 
    catch 
     { Class3 obj3 = JsonConvert.DeserializeObject<Class3>(rawData); 
     //code to run if data is of Class3... 
     } 
} 

Gibt es einen saubereren Weg als oben?

+0

Wenn möglich, könnte es sinnvoll sein, unterschiedliche Endpunkte für jeden Status-Update-Typ zu konfigurieren. Alternativ speichert die Klasse alle möglichen Informationen und entscheidet dann, wie sie nach der Deserialisierung verarbeitet werden. – Rob

+6

Gibt es eine Möglichkeit, aus den Rohdaten zu verstehen, welche Art von Klasse deserialisiert werden soll? Das Verwenden von Ausnahmen zum Steuern Ihres Codes sollte so weit wie möglich vermieden werden. – Steve

+0

Haben Sie Beispiele für den JSON? vielleicht können Sie herausfinden, welcher Typ vor dem Aufruf von 'DeserializeObject ' – Nasreddine

Antwort

3

Im Idealfall sollten Sie keine Ausnahmen verwenden, um Entscheidungen über Codepfade zu treffen, die sich nicht mit Ausnahmesituationen befassen. Ist dies etwas, das Sie nicht vermeiden können, können Sie eine Schleife einrichten, die verschiedene Klassen versucht, wie folgt aus:

var deserializers = new Func<string,object>[] { 
    (rawData) => JsonConvert.DeserializeObject<Class1>(rawData) 
, (rawData) => JsonConvert.DeserializeObject<Class2>(rawData) 
, (rawData) => JsonConvert.DeserializeObject<Class3>(rawData) 
}; 
object result = null; 
foreach (var d in deserializers) { 
    try { 
     result = d(rawData); 
     break; 
    } catch { 
     // Conversion was unsuccessful 
    } 
} 

Wenn Deserialisieren OK ging, wird break Anweisung erreicht, und Ihre Schleife beendet. Andernfalls fährt die Schleife mit der nächsten Iteration fort, bis die Schleife erfolgreich ist oder uns die Deserializer ausgehen.

Hinweis: eine explizite Umwandlung erforderlich, um sein kann functors in ein Array zu setzen:

(rawData) => (object)JsonConvert.DeserializeObject<Class1>(rawData) 
+0

Ich frage mich, ob man nur tun kann 'neue Func [] { JsonConvert.DeserializeObject , JsonConvert.DeserializeObject , JsonConvert.DeserializeObject , }'. –

+1

@ JeppeStigNielsen Ich bin mir da nicht sicher, weil 'JsonConvert.DeserializeObject ' verschiedene Rückgabetypen haben. Ich bin mir nicht einmal sicher, ob die Syntax, die ich verwendet habe, ohne eine explizite Besetzung funktionieren würde. – dasblinkenlight

Verwandte Themen