我有一个Facebook正在调用的回调网络方法。不幸的是,使用此单个URL 的调用的目的仅由在Post主体中传递的对象(json)的结构决定。现在,我在考虑:
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 :(得分: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)