c# - 通过反射在抽象类中调用异步任务
问题描述
我正在尝试使用反射来异步运行任务。问题是这个类是抽象的。我让它InvokeMember
在同步上下文中工作。使用 async 由于某种原因找不到该方法..所以这就是我想出的。它不起作用,因为我无法将抽象类的对象传递给 Invoke 方法.. 死胡同?
public MyClass
{
public async Task<string> MyMethod()
{
var tasks = new List<Task>();
for (int i = 0; i < 3; i++)
{
string taskType = "Banana"; // should be an array[i]
Type type = Type.GetType("MyService." + taskType);
var method = type.GetMethod("Test");
var result = (Task<string>)method.Invoke(null, null);
tasks.Add(result);
}
await Task.WhenAll(tasks);
}
}
例如,上面的“taskType”是一个如下所示的类:
public abstract class Banana
{
public async Task<string> Test(string input)
{
await Task.Delay(5000);
return "foo";
}
}
解决方案
我们已经在评论中讨论过这个问题,但也许下面的代码会给你一个更好的主意。
public class MyClass
{
public async Task<string> MyMethod()
{
var tasks = new List<Task>();
for (int i = 0; i < 3; i++)
{
string taskType = "Banana"; // should be an array[i]
Type type = Type.GetType("MyService." + taskType);
var method = type.GetMethod("Test");
var result = (Task)method.Invoke(null, null);
tasks.Add(result);
}
await Task.WhenAll(tasks);
var theResult = string.Empty;
foreach(var task in tasks)
{
theResult += (string)task.GetType().GetProperty("Result").GetValue(task);
}
return theResult;
}
}
我已经完全盲目地编写它并且无法测试它 - 请耐心等待!
但总体思路如下:具体的异步方法是 of Task<string>
,但我找不到调用异步泛型方法的方法。但是由于 everyTask<T>
是非泛型的Task
,我们可以转换为它并等待它。每个元素tasks
都是 a的附加知识Task<string>
允许我们Result
通过反射检索其属性。
推荐阅读
- php - 按 id 对数组进行分组并检查
- c# - 使用配置文件指定连接字符串来定义单元测试中的数据源
- c++ - 将 void* 强制转换为具有多重继承的类
- phpstorm - 从 PhpStorm 中查找 GIT 存储库
- visual-studio-2017 - SSIS:“找不到 SQLIPackage140”
- javascript - 如何删除 lodash 模板创建的换行符?
- python - Tensorflow AttributeError:类型对象'numpy.ndarray'没有属性'__array_function__'
- ios - 重新加载 UITableView 除了它的一部分
- c# - Xamarin IOS:BLE
- mariadb - 为什么一个简单的 ALTER 语句会导致 galera 崩溃