You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并接收不同Func类型参数的两个C#异步重载函数?

解决方案

你不需要强行把两个函数合并为单个签名,仅保留接收异步委托的重载作为核心实现,同步委托的重载仅做一层适配即可,完全消除重复代码。

实现代码

首先保留逻辑完整的异步版本作为唯一的核心实现:

private static async Task<MyReturnType> MyFunctionCore(Func<Task<MyReturnType>> func)
{
    // 所有公共逻辑都只写在这里
    // do stuff
    while (/* some conditions */)
    {
        var myReturn = await func();
        // do stuff
    }
    // do stuff
}

然后对外暴露两个重载,分别适配同步和异步委托入参:

// 同步委托重载
public static Task<MyReturnType> MyFunction(Func<MyReturnType> func)
{
    // 把同步委托包装成异步委托调用核心实现
    return MyFunctionCore(() => Task.FromResult(func()));
}

// 异步委托重载
public static Task<MyReturnType> MyFunction(Func<Task<MyReturnType>> func)
{
    return MyFunctionCore(func);
}

注意事项

  • 如果需要严格对齐原同步版本的异常行为(即同步委托调用时抛出的异常和异步版本一样包裹在Task中返回,而不是直接抛出),可以给同步重载加一层异常捕获:
    public static Task<MyReturnType> MyFunction(Func<MyReturnType> func)
    {
        try
        {
            return MyFunctionCore(() => Task.FromResult(func()));
        }
        catch (Exception ex)
        {
            return Task.FromException<MyReturnType>(ex);
        }
    }
    
  • 这种方案对外的API签名和你原来的两个重载完全一致,已有调用代码不需要做任何修改

内容的提问来源于stack exchange,提问作者Antediluvian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:36:04