c# - 使函数更通用以节省重复
问题描述
我使用以下功能,一切都很好,但我基本上做了大约 20 次相同的操作。对于 api 的各种端点,我正在考虑如何使该路由在传递和返回 T 类型的能力方面更加通用。
public async Task<List<StockItem>> GetStockDataFromSage()
{
StockItem stockitems = new StockItem();
string content = "";
List<StockItem> result = new List<StockItem>();
var uri = new Uri(string.Format(Constants.GetStockItems, string.Empty));
var response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
content = await response.Content.ReadAsStringAsync();
result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<StockItem>>(content);
}
return result;
}
编辑 1
我正在尝试使用以下内容,但是出现错误
public async Task<List<StockItem>> GetStockItemInfo()
{
return await dataTransfer.GetDataFromSageService(Constants.GetStockItems, string.Empty)) ?? new List<StockItem>();
}
严重性代码描述项目文件行抑制状态错误 CS1061“StockTakeDT”不包含“GetStockDataFromSage”的定义,并且找不到接受“StockTakeDT”类型的第一个参数的可访问扩展方法“GetStockDataFromSage”(您是否缺少 using 指令或程序集参考?) StockAppDL D:\Git\Repos\StockApp\FStockApp\StockAppDal\StockDatabase.cs 76 活动
解决方案
您的目标似乎是调用端点并将结果返回到您可以使用的对象中。如果调用成功,则返回结果,如果调用失败,则返回空列表。
我们可以将该逻辑抽象为一个通用方法,该方法接受 url 和参数并返回一个对象。
public async Task<T> GetObjectFromEndpoint<T>(string url, params string[] args)
where T : class
{
var uri = new Uri(string.Format(url, args));
var response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(content);
}
return default(T);
}
现在,您的 GetStockDataFromSage 函数会传入此调用独有的信息,即结果的 url、参数和泛型类型。如果结果为空,GetStockDataFromSage 返回一个空的 StockItems 列表
public async Task<List<StockItem>> GetStockDataFromSage()
{
return (await GetObjectFromEndpoint<List<StockItem>>(Constants.GetStockItems, string.Empty)) ?? new List<StockItem>();
}
任何时候你想尽量减少重复,你想看看这个调用的具体内容和更一般的内容。即List<StockItem>
,url 和可能的参数是唯一的,但其余的代码是非常通用的。
注意:这种在 api 调用失败时返回默认值的方法可能会导致难以诊断的问题,您将无法区分空列表和失败的 api 调用。我建议为失败的 api 调用添加一些日志记录,并可能寻找通知调用代码结果错误的方法。
推荐阅读
- ubuntu - 如何设置 Visual Studio Code 以在 Linux 上调试 C 程序?
- python - Ctypes-无法使用 NtQueryInformationProcess 获取 PEB 地址
- react-native - 如何将多个数据的数组设置为状态
- kivy - Kivy RecycleView。附加来自另一个类的数据
- django-models - Django 水平总和布尔字段
- r - 如何解释来自 cv.kknn(kknn 包)的交叉验证输出
- r - 是否有一个 R 函数可以将其转换为循环以便从列中选择数据?
- python - 在 python haar cascade 中捕获双眼
- linq - 动态排序列在 linq 中不起作用
- python - 顺序文件抓取文本文件 - 一种更智能的方式?