2016-06-04 2 views
0

У меня есть метод обратного вызова, который вызывает Facebook. К сожалению, цель вызова с использованием этого одного URL-адреса определяется исключительно структурой объекта (json), который передается в теле Почты. Сейчас я думаю о:Есть ли более эффективный синтаксис для mutliple try/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... 
     } 
} 

Есть ли более чистый способ, чем выше?

+0

Если возможно, было бы целесообразно, чтобы настроить различные конечные точки для каждого типа обновления статуса. В качестве альтернативы, класс сохранит всю возможную информацию, а затем решит, как обрабатывать ее после ее десериализации. – Rob

+6

Есть ли у вас какой-либо способ понять из необработанных данных, какой класс следует десериализовать? Использование исключений для вождения вашего кода следует избегать как можно больше – Steve

+0

Есть ли у вас примеры json? возможно, вы можете узнать, какой тип использовать перед вызовом 'DeserializeObject ' – Nasreddine

ответ

3

В идеале вы не должны использовать исключения для принятия решений о путях кода, которые не имеют отношения к исключительным ситуациям. Если это то, что вы не можете избежать, вы можете создать цикл, который подставляет различные классы, как это:

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

Если десериализации прошли нормально, достигается break утверждения, и ваши выходы цикла. В противном случае цикл продолжается до следующей итерации до тех пор, пока цикл не завершится, или мы не закончим десериализаторы.

Примечание: явного приведения может потребоваться для того, чтобы положить функторы в массив:

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

Интересно, если можно просто сделать 'новый Func [] { JsonConvert.DeserializeObject , JsonConvert.DeserializeObject , JsonConvert.DeserializeObject , }'. –

+1

@JeppeStigNielsen Я не уверен в этом, потому что 'JsonConvert.DeserializeObject ' имеют разные типы возврата. Я даже не уверен, что синтаксис, который я использовал, будет работать без явного приведения. – dasblinkenlight

Смежные вопросы