如何合并接收不同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
相关产品推荐
相关产品推荐

