2010-09-23 47 views
2

是否可以调用一个传递具有可变数量参数的lambda的方法?将lambda传递给具有不同参数的方法

例如:

public void Go(Action x) 
{ 
} 

我需要调用它传递参数,如:

Go(() => {}); 
Go((x, y) => {}); 
Go((x) => {}); 

这可能吗?怎么样?

回答

1

您可以创建重载为

public void Go<T>(Action<T> x) 
{ 
} 

这里是表示Action<T>更多的例子的文章。请注意,它没有返回值,从MSDN:

封装具有 单个参数,并且不返回 值的方法。

+0

@布鲁诺,你为什么编辑尤里的帖子和社论的额外内容?这对于编辑来说并不合适,因为它意味着该内容的作者是尤里,而实际上它就是你。 “修改”应该用于更正。相反,你应该添加一条评论(像这样)。 – 2010-09-23 19:24:45

+0

如果我不能改进他的答案,我会发布我自己的并接受它。如果他不喜欢编辑他可以删除,然后我会创建另一个答案。 – BrunoLM 2010-09-23 19:25:54

+0

我很酷。 – 2010-09-23 19:35:47

6

不是没有铸造。但随着铸造,它很容易做到:

void Go(System.Delegate d) {} 
... 
Go((Action)(()=>{})); 
Go((Action<int>)(x=>{})); 
Go((Action<int, int>)((x,y)=>{})); 

出于好奇,什么是围棋的身体怎么办?你有一个未知类型的委托,所以你不知道要通过什么参数来调用它。你打算如何调用这个委托?

+0

您必须将lambda表达式放在括号中。除非你改变实施。 – 2010-09-23 19:06:43

+0

@Yuriy:好点,谢谢! – 2010-09-23 19:10:24

0

您必须强烈定义每个lambda类型的签名。

public TResult Go<TResult>(Func<TResult> x) {return x()}; 

public TResult Go<T,TResult>(Func<T, TResult> x, T param1) {return x(param1)}; 

...