我的目标是将具有返回类型的任何函数传递给Execute方法,并序列化并存储其结果。下面是我要尝试做的一个粗略想法,显然不会编译,但希望它能使想法得到理解。我想我也应该能够递归地处理嵌套任务。有什么想法吗?

public static TResult Execute<TResult>(Func<TResult> method)
        where TResult : class
    {

        var result = method();
        if(result is Task)
        {
            var taskResult = await result;
            StoreResult(taskResult);
        }
        else
        {
            StoreResult(result);
        }
    }

最佳答案

我同意Lee的评论,即Func<Task<TResult>>的单独重载是正确的解决方案。

但是,如果您真的想使用一个重载来执行此操作,则可以使用反射和dynamic来完成此工作:

public async static Task Execute<TResult>(Func<TResult> method) where TResult : class
{
    var result = method();

    if (typeof(TResult).IsGenericType
        && typeof(TResult).GetGenericTypeDefinition() == typeof(Task<>))
    {
        var taskResult = await (dynamic)result;
        StoreResult(taskResult);
    }
    else
    {
        StoreResult(result);
    }
}

关于c# - 是否可以确定方法是否返回Task并等待它返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40539091/

10-12 14:52