我有以下方法:
public async Task Execute()
{
object previous = null;
// _delegates is of type IReadOnlyCollection<Delegate>
foreach (Delegate method in _delegates)
{
Task executing = (Task) (previous != null
? method.DynamicInvoke(_repository, previous)
: method.DynamicInvoke(_repository);
await executing;
// pseudo code here
if (executing returns something)
previous = executing.Result //<-- ?
else
previous = null;
}
}
基本上,我遍历按顺序执行的代表列表。每个委托都会收到一个存储库作为参数,以及前一个委托的返回值(如果有)。
有些代表返回
Task
,而有些则返回Task<TResult>
。如果遇到后者,我想将TResult
值存储在previous
中,以便将其作为参数传递给下一个委托。有没有办法做到这一点?
最佳答案
您可以使用反射来检查executing
对象的类型是否为Task<T>
,然后如下所示读取“ Result”属性:
var taskType = executing.GetType();
bool isTaskOfT =
taskType.IsGenericType
&& taskType.GetGenericTypeDefinition() == typeof(Task<>);
if (isTaskOfT)
{
object result = taskType.GetProperty("Result").GetValue(executing);
}