2010-09-23 52 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)}; 

...