C# 通过反射调用抽象类中的异步任务

C# 通过反射调用抽象类中的异步任务,c#,asp.net-core,asynchronous,C#,Asp.net Core,Asynchronous,我正在尝试使用反射异步运行任务。问题是这个类是抽象的。我在同步上下文中使用了InvokeMember。使用async时,由于某种原因找不到该方法。。这就是我的想法。它不起作用,因为我无法将抽象类的对象传递给Invoke方法。。死胡同 public MyClass { public async Task<string> MyMethod() { var tasks = new List<Task>(); for (int i = 0; i <

我正在尝试使用反射异步运行任务。问题是这个类是抽象的。我在同步上下文中使用了
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);
  }
}
公共MyClass
{
公共异步任务MyMethod()
{ 
var tasks=新列表();
对于(int i=0;i<3;i++)
{
字符串taskType=“Banana”;//应该是数组[i]
Type Type=Type.GetType(“MyService.+taskType”);
var方法=type.GetMethod(“测试”);
var result=(Task)method.Invoke(null,null);
任务。添加(结果);
}    
等待任务。何时(任务);
}
}
例如,上面的“taskType”是一个如下所示的类:

public abstract class Banana
{
    public async Task<string> Test(string input)
    {
        await Task.Delay(5000);
        return "foo";
    }
}
公共抽象类
{
公共异步任务测试(字符串输入)
{
等待任务。延迟(5000);
返回“foo”;
}
}

我们在评论中已经讨论过这一点,但下面的代码可能会给您提供更好的想法

公共类MyClass
{
公共异步任务MyMethod()
{ 
var tasks=新列表();
对于(int i=0;i<3;i++)
{
字符串taskType=“Banana”;//应该是数组[i]
Type Type=Type.GetType(“MyService.+taskType”);
var方法=type.GetMethod(“测试”);
var result=(Task)method.Invoke(null,null);
任务。添加(结果);
}
等待任务。何时(任务);
var-theResult=string.Empty;
foreach(任务中的var任务)
{
theResult+=(字符串)task.GetType().GetProperty(“结果”).GetValue(任务);
}
返回结果;
}
}
我写它完全是盲目的,无法测试它-请容忍我


但总体思路如下:具体的异步方法是
Task
,但我找不到调用异步通用方法的方法。但由于每个
任务
都是非通用的
任务
,我们可以对其进行转换并等待它。
任务
中的每个元素都是一个
任务
的附加知识允许我们通过反射检索其属性
结果

香蕉是抽象的有什么原因吗?您能确认找不到该方法吗?或者您在转换到任务时遇到问题了吗?因为我做的基本相同(除了我的基类不是抽象的),但我的问题是泛型
任务
。这似乎不受支持,使用
Task
反而帮助了我。@Fildor它是一个发出http请求的实用程序类。至少还有3个类似香蕉的类,应该是run@Fildor也许最好使香蕉非抽象,并将httpclient对象作为参数传递给它……因为您已经在使用反射,您可以自己模拟:等待所有任务,使用
result.GetType().GetProperty(“result”).GetValue(result)
(因为具体实例是
Task
)并返回此值。我认为问题还在于,由于
var result=(Task)方法,因此没有任何可调用的内容。invoke(null,null);
将不会运行,因为我需要“香蕉”类的实例作为参数传递给invoke方法。有趣的讨论!:-)