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

能否在C#中通过Action向方法参数传递值?

问题解答

首先明确:你当前的写法是不支持的,编译阶段就会报错。原因很简单:你定义的Something是无参的Action委托(对应无返回值、无参数的方法签名),但你要绑定的Foo方法是带int参数的,两者签名不匹配,C#的委托绑定要求方法签名完全一致。

要实现「让OneClass传递参数给Foo」的需求,有两种常见的正确做法:


方法一:修改Action的签名为带参数版本

直接把OneClass里的委托定义改成带int参数的Action<int>,这样就能直接绑定带参的Foo方法,触发时由OneClass传入参数:

修正后的OneClass代码:

public class OneClass
{
    // 改成带int参数的Action委托
    public Action<int> Something;

    // 示例:在某个逻辑里触发委托并传递参数
    public void TriggerSomething()
    {
        int numToPass = 42; // 这里的参数由OneClass决定
        Something?.Invoke(numToPass);
    }
}

订阅端代码(无需修改Foo方法):

private void Foo(int num)
{
    Debug.Log(num);
}

// 直接绑定即可,签名匹配
OneClass.Something += Foo;

方法二:用Lambda表达式包装(适合无法修改原委托签名的场景)

如果因为历史代码限制,不能修改Something的Action无参签名,可以用Lambda表达式作为中间层,在触发时由OneClass传递参数(不过这种方式如果要动态传参,还是需要OneClass能把参数暴露出来):

OneClass代码(保持原无参Action):

public class OneClass
{
    public Action Something;
    // 假设OneClass里有一个要传递的参数字段
    public int ParamToPass { get; set; }

    public void TriggerSomething()
    {
        Something?.Invoke();
    }
}

订阅端代码:

private void Foo(int num)
{
    Debug.Log(num);
}

// 用Lambda包装,调用Foo时传入OneClass的参数
OneClass.Something += () => Foo(OneClass.ParamToPass);

这种方式的局限性是:如果参数是触发时动态生成的,原无参委托无法传递,所以优先推荐方法一,让委托签名和方法签名匹配,这是C#委托设计的规范用法。


内容的提问来源于stack exchange,提问作者Kevin Van Gestel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:20:31