【问题标题】:C# returning different types from functionC#从函数返回不同类型
【发布时间】:2017-08-18 08:19:36
【问题描述】:

我编写了以下代码,它基本上对我的服务器执行 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 操作中返回的服务器类型,如下所示:

public ActionResult SomeActon(){
var response = PerformMyAwesomeRequest("mytokenhere...");
//response object is assigned a corresponding type only at runtime...
}

所以我的问题是:

  • 我可以从对服务器执行 http 请求的函数返回什么类型,以便我可以直接在代码中而不是在运行时知道从函数返回的类型?

【问题讨论】:

  • HttpResponseMessage 怎么样?
  • @kaarthickraman 能否详细说明一下,我不确定?

标签: c# asp.net json asp.net-mvc asp.net-mvc-5


【解决方案1】:

方法返回不同类型对象的唯一方法是返回它们的公共基类型。但是,您已经发现 object 的公共超类对您没有帮助,所以让我们首先考虑返回对象的替代方法:

  • 成功返回并抛出错误 - 这种方法可以让您返回MyCustomType,并抛出一些异常包装ErrorMessageCustomType。由于返回一个对象,然后抛出另一个对象,因此不需要关联类型。
  • 返回一个组合对象 - 为您计划返回的每种类型创建包含成员的类,并在 PerformMyAwesomeRequest 方法中仅设置其中一个。这不太好,因为它需要调用者中的if-elses 链。
  • 接受out错误参数 - 如果请求不成功,返回null,并将out参数设置为ErrorMessageCustomType
  • 接受回调委托 - 不返回值,而是接受两个委托,一个代表成功,一个代表失败,即void PerformMyAwesomeRequest(string tok, Action&lt;MyCustomType&gt; onSuccess, Action&lt;ErrorMessageCustomType&gt; 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));
    }
}

【讨论】:

  • 我喜欢回调委托的最后一个场景。在我的情况下,你能告诉我最后一个场景的用法示例吗? =)
  • 由于函数无效,我如何在函数中发出信号是成功还是错误?
  • @User987 你不需要这个信号,因为结果是越界传递的。换句话说,调用结果只会激活两个回调中的一个,而不是两个,因此如果您的代码发现自己在 data 回调中,则可以假定没有错误,反之亦然。跨度>
  • 所以最后一行我只做这个:client.Execute(request).Content 一切都好吗? o.o
  • @User987 您的代码查看内容,并决定调用哪个回调。我进行了编辑以解释实施过程中发生的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多