能否在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
相关产品推荐
相关产品推荐

