c# - 如何使用 C# 异步方法重载和返回多种类型?
问题描述
我想要一堆GetDataAsync()
重载的方法,以根据所需的类型返回各种数据集。如果函数不是异步的,我可以根据out
参数重载:
public void GetData(int userId, out int age, out string name) { ... }
public void GetData(int userId, out string name, out string address) { ... }
但out
不允许用于async
方法。接下来,我尝试使用泛型来重载(我更改了string
和int
其他类型,因为这个技巧对密封类无效):
public async Task<Tuple<TName, TAddress>> GetDataAsync<TName, TAddress>(int userId)
where TAddress : Address where TName : Name
{ ... }
public async Task<Tuple<TAge, TName>> GetDataAsync<TAge, TName>(int userId)
where TAge : Age where TName : Name
{ ... }
但我收集模板专业化在 C# 中并不真正存在,因此这些被认为是相同的功能。
启用此重载的丑陋 hack 是传入函数填充的缓冲区:
public async Task GetDataAsync(int userId, int[] id_output, string[] name_output)
{
await Task.Delay(10);
id_output[0] = 60;
name_output[0] = "Freddy";
}
public async Task GetDataAsync(int userId, string[] name_output, string[] address_output)
{
await Task.Delay(10);
name_output[0] = "Freddy";
address_output[0] = "Elm Street";
}
但是那个 hack 有一个糟糕的 API。(使用列表作为缓冲区会更安全一些。)是否有任何适当的 C# 方法可以从异步重载中获取不同的数据类型?如果必须,我会将数据类型合并到函数名称中而不是重载,但这似乎是不必要的冗长。而且由于函数抽象了数据库调用,其中一些函数的名称确实很长!(这些函数大多有不止一个调用者,因此希望集中定义它们,而不是在调用它们的类中。)
解决方案
推荐阅读
- mips - lui 指令中的立即数范围
- php - 如何在 PHP 的关联数组中使用复杂对象作为键?
- javascript - 在 slickgrid 上混合可点击行和不可点击行
- c++ - 关于静态全局 lambda 变量的错误警告?
- spring - 将 apache tomcat 服务器从 7.0 升级到 8.5.5 时出错,请检查您是否有多个 ContextLoader*
- javascript - 带有音色控制的 JS 音高变换
- java - 如何为标准对话框 PreferenceFragmentCompat 设置可取消(假)
- spring-boot - Spring Cloud Stream 2.0 和 startOffset 最新
- weather - aeris 天气框架中的温度模块
- use-case - 用例 Plantuml - 垂直堆叠组件