我有以下方法:
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
中,这样我就可以将它作为参数传递给下一个委托。
有没有办法实现这个目标?
答案 0 :(得分:4)
您可以使用Reflection来检查executing
对象的类型是否为Task<T>
,然后阅读&#34;结果&#34;财产如果是这样的话:
var taskType = executing.GetType();
bool isTaskOfT =
taskType.IsGenericType
&& taskType.GetGenericTypeDefinition() == typeof(Task<>);
if (isTaskOfT)
{
object result = taskType.GetProperty("Result").GetValue(executing);
}
答案 1 :(得分:-2)
如果你需要添加施法:
if (executing returns something)
previous = ((Task<object>)executing).Result
else
previous = null;