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

如何在异步方法调用中传递异步方法委托?委托类型定义

解决异步方法委托定义的问题

这个问题其实很简单,核心就是要匹配你那两个异步方法的签名来定义委托类型就行,给你两种常用的方案:

方案1:自定义委托类型

既然你的Method_1_Async和Method_2_Async都是**接受一个string参数,返回Task**的异步方法,那你可以直接定义一个完全匹配这个签名的委托类型:

// 定义匹配异步方法签名的委托
public delegate Task<string> DelegateMethodClass(string parameter);

这样你的Method_3_Async就可以直接用这个委托类型作为参数,调用起来完全符合你预期的形式:

public async Task<string> Method_3_Async(DelegateMethodClass methodName, string parameter)
{
    return await methodName(parameter);
}

// 调用示例
var result1 = await Method_3_Async(Method_1_Async, "testParam1");
var result2 = await Method_3_Async(Method_2_Async, "testParam2");

方案2:使用内置泛型委托(更推荐)

其实.NET已经为我们提供了现成的泛型委托Func<T, TResult>,完全可以替代自定义委托,不用额外写委托定义代码,更简洁。

你的异步方法签名对应Func<string, Task<string>>——第一个泛型参数是输入的string类型,第二个是返回的Task<string>类型。这样Method_3_Async可以写成:

public async Task<string> Method_3_Async(Func<string, Task<string>> methodName, string parameter)
{
    return await methodName(parameter);
}

// 调用方式和上面完全一样
var result1 = await Method_3_Async(Method_1_Async, "testParam1");

为什么这两种方案都可行?

异步方法的底层本质就是返回Task或Task<T>的普通方法,所以只要委托的签名(参数类型、数量,返回值类型)和异步方法完全匹配,就可以直接把方法组作为参数传递进去,不需要额外的包装。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:02:39