[英]C# returning different types from function
我編寫了以下代碼,它基本上對我的服務器執行JSON請求:
var client = new RestClient("mysite.com");
var request = new RestRequest(Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddParameter("application/x-www-form-urlencoded", /*params here...*/ ,ParameterType.RequestBody);
return JsonConvert.DeserializeObject<MyCustomType>(client.Execute(request).Content);
請注意最后一行代碼:
return JsonConvert.DeserializeObject<MyCustomType>(client.Execute(request).Content);
我將返回的JSON從服務器反序列化到我的應用程序中以前的類結構。
現在問題是服務器可以返回錯誤響應或成功響應,並且對於每種情況我都需要不同的類結構,以便我可以將它們映射到C#類對象...
所以我認為這樣的事情會做:
public object PerformMyAwesomeRequest(string myToken)
{
var response =client.Execute(request).Content;
var statusCode = FetchStatusCode(response);
if(statusCode == 0)//signaling the response returned error
{
return JsonConvert.DeserializeObject<ErrorMessageCustomType>(response);
}
else{
return JsonConvert.DeserializeObject<MyCustomType>(response);
}
}
所以這樣它不會給我任何錯誤......但是這里的問題是這些對象現在只存在於運行時,我無法確定我的.NET MVC Action中返回的類型服務器如下所示:
public ActionResult SomeActon(){
var response = PerformMyAwesomeRequest("mytokenhere...");
//response object is assigned a corresponding type only at runtime...
}
所以我的問題是:
返回不同類型對象的方法的唯一方法是返回它們的公共基類型。 但是,您已經發現object
的常見超類對您沒有幫助,所以讓我們考慮首先返回對象的替代方法:
MyCustomType
,並拋出一些異常包裝ErrorMessageCustomType
。 由於返回一個對象而拋出另一個對象,因此不需要關聯類型。 PerformMyAwesomeRequest
方法中僅設置其中一個。 這不是很好,因為它需要調用者中的if
- else
s鏈。 out
參數 - 如果請求不成功,則返回null
,並將out
參數設置為ErrorMessageCustomType
。 void PerformMyAwesomeRequest(string tok, Action<MyCustomType> onSuccess, Action<ErrorMessageCustomType> onError)
。 最后一種方法可以像這樣使用:
PerformMyAwesomeRequest(
myToken
, data => {
Console.WriteLine("Received data: {0}", data);
}
, error => {
Console.WriteLine("Received error: {0}", error);
}
);
該方法可以這樣實現:
public void PerformMyAwesomeRequest(string myToken, Action<MyCustomType> onSuccess, Action<ErrorMessageCustomType> onError) {
var response = client.Execute(request).Content;
var statusCode = FetchStatusCode(response);
if (statusCode != 0) {
onSuccess(JsonConvert.DeserializeObject<MyCustomType>(response));
} else {
onError(JsonConvert.DeserializeObject<ErrorMessageCustomType>(response));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.