gpt4 book ai didi

c# - 返回多种类型

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:28 25 4
gpt4 key购买 nike

我的 xamarin 应用程序中有一个方法可以从服务器获取一些数据,我需要该方法在 HTTP 请求成功时返回数据,或者在服务器返回错误时返回“系统错误”字符串,或者如果没有连接,则为“Internet 连接错误”字符串。

我想知道如何设置返回类型以返回其中之一。我知道元组可以返回多个。但我相信两者兼而有之。

我的代码

public async Task<List<AllReportVM>> GetAllReports(string token, string username)
{
var httpClient = GetHttpClient();
if (CrossConnectivity.Current.IsConnected) {
var response = await httpClient.GetAsync ("getdashboardreports.ashx").ConfigureAwait (false);

if (response.IsSuccessStatusCode) {
var content = response.Content;

string jsonString = await content.ReadAsStringAsync ().ConfigureAwait (false);

return JsonConvert.DeserializeObject<List<AllReportVM>> (jsonString);
} else {
return "SystemError";
}
} else {
return "Internet Connectivity Error";

}
}

最佳答案

您要的实际上是一个 discriminated union . C# 本身并没有这样的东西。有几种方法可以解决这个问题。首先,考虑我所说的试用/试用模式:

public bool GetAllResults(string token, string username, out List<AllReportVM> results);

这对于相对简单的方法来说没问题,但它实际上并没有给你错误信息(至少给出了它通常的实现方式)并且 out 参数不适用于 异步 方法。所以我们可以排除这种可能性。

第二个选项是throw an exception出现错误时,我在 90% 的情况下都建议这样做:

public async Task<List<AllReportVM>> GetAllReports(string token, string username)
{
var httpClient = GetHttpClient();
if (CrossConnectivity.Current.IsConnected) {
var response = await httpClient.GetAsync ("getdashboardreports.ashx").ConfigureAwait (false);

if (response.IsSuccessStatusCode) {
var content = response.Content;

string jsonString = await content.ReadAsStringAsync ().ConfigureAwait (false);

return JsonConvert.DeserializeObject<List<AllReportVM>> (jsonString);
} else {
throw new RequestException("SystemError");
}
} else {
throw new RequestException("Internet Connectivity Error");
}
}

要调用它,您必须使用:

try 
{
var list = await obj.GetAllReports(token, username);
...
}
catch (RequestException ex)
{
Console.WriteLine(ex.Message);
}

这是一个非常稳固、完善的模式。事实上,您可能已经对应用程序中可能发生的各种其他异常使用了异常处理。但是,它确实会对性能产生一些影响,您应该避免将异常用于简单的控制流。对于需要发出大量请求并期望有效处理故障(例如批处理)的应用程序,这可能不是一个选项。当我过去遇到过这样的情况时,我发现实现自定义类很有用,例如:

public class RequestResult<T>
{
public bool Success { get; }
public T Result { get; }
public string ErrorMessage { get; }

private RequestResult(bool success, T result, string errorMessage)
{
this.Success = success;
this.Result = result;
this.ErrorMessage = errorMessage;
}

public static RequestResult<T> Success(T result)
{
return new RequestResult<T>(true, result, null);
}

public static RequestResult<T> Failure(string errorMessage)
{
return new RequestResult<T>(false, default(T), errorMessage);
}
}

public async Task<RequestResult<List<AllReportVM>>> GetAllReports(string token, string username)
{
var httpClient = GetHttpClient();
if (CrossConnectivity.Current.IsConnected) {
var response = await httpClient.GetAsync ("getdashboardreports.ashx").ConfigureAwait (false);

if (response.IsSuccessStatusCode) {
var content = response.Content;

string jsonString = await content.ReadAsStringAsync ().ConfigureAwait (false);

var result = JsonConvert.DeserializeObject<List<AllReportVM>> (jsonString);
return RequestResult.Success(result);
} else {
return RequestResult.Failure("SystemError");
}
} else {
return RequestResult.Failure("Internet Connectivity Error");
}
}

关于c# - 返回多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37200808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com