簡體   English   中英

C#從函數中返回不同的類型

[英]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...
}

所以我的問題是:

  • 我可以從對服務器執行http請求的函數返回什么類型,以便我可以直接在代碼中知道從函數返回的類型,而不僅僅是在運行時?

返回不同類型對象的方法的唯一方法是返回它們的公共基類型。 但是,您已經發現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM