Вызов asyn c Задача в абстрактном классе с помощью Reflection - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь запускать задачи asyn c с помощью отражения. Проблема в том, что класс абстрактный. Я получил это для работы с InvokeMember в синхронном контексте. С asyn c метод не найден по какой-то причине .. Так что это то, что я придумал вместо этого. Это не работает, потому что я не могу передать объект абстрактного класса в метод 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";
    }
}

1 Ответ

1 голос
/ 23 апреля 2020

Мы обсуждали это в комментариях, но, возможно, следующий код дает вам лучшую идею.

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;
  }
}

Я написал это полностью слепым и не смог проверить это - потерпите меня!

Но общая идея заключается в следующем: конкретный асинхронный метод c имеет Task<string>, но я не смог найти способ вызвать асинхронный c generi c метод. Но так как каждый Task<T> не является родовым c Task, мы можем привести его к ожиданию. Дополнительные знания о том, что каждый элемент в tasks является Task<string>, позволяют нам получить его свойство Result посредством отражения.

...