[英]C# Action and Func parameter overloads
我需要一個采用Action(或Func)的方法,但Action有一個混合數量的參數。 實現這些重載的最直接,最緊湊的方法是什么:
public void Execute<T>(Action<T> action, T param) {
// TODO: Implement something like:
// Execute(action, param, null);
}
public void Execute<T1,T2>(Action<T1,T2> action, T1 param1, T2 param2) {
// TODO: Implement something like:
// Execute(action, param1, param2, null);
}
public void Execute<T1,T2,T3>(Action<T1,T2,T3> action, T1 param1, T2 param2, T3 param3) {
DoStuff();
action(param1, param2, param3)
DoMoreStuff();
}
// OR any other type of higher order function-solution
public void Execute(Action action, params object[] parameters) { ... } // ???
除了執行操作及其參數之外,方法的內容完全相同。
如果可能,請不要使用任何特定於C#4.0的功能來解決此問題。
除了執行操作及其參數之外,方法的內容完全相同。
這對使用更高階函數感到尖叫,但由於你已經參數化了所有正在改變的位(執行動作及其參數),你已經存在了。 抱歉,看起來你必須手動實現這些重載。
只是鏈接使用空值將無法工作,因為傳遞的委托不匹配。 你可以做的是將傳遞的action / func包裝在lambda中以剝離其他參數 :
public void Execute(Action<T> action, T param) {
Execute( (a, _) => action(a) , param, null);
}
public void Execute(Action<T1, T2> action, T1 param1, T2 param2) {
Execute( (a, b, _) => action(a, b) , param1, param2, null);
}
public void Execute(Action<T1, T2, T3> action, T1 param1, T2 param2, T3 param3) {
DoStuff();
action(param1, param2, param3)
DoMoreStuff();
}
這實際上是最好的方法(記住Johannes的觀點,你也可以使用更高階的函數),因為它是最類型友好的(委托將自動匹配正確的參數數量和類型)並且不需要任何麻煩的DynamicInvoke
調用。
但是,您的上一個方法定義存在問題。 一個Action
本質上不接受任何參數,所以它不會與params object[]
參數一起使用。 如果你想要一個接受可變數量參數的最終重載,那么畢竟我會使用DynamicInvoke
,只是為了這個方法調用:
public void Execute(Delegate action, params object[] parameters)
{
DoStuff();
action.DynamicInvoke(parameters);
DoMoreStuff();
}
但是為了擴展約翰內斯所說的話,我認為他基本上是這樣的:
public Action<T1, T2, T3> CreateAction<T1, T2, T3>(Action action)
{
return (T1 x, T2 y, T3 z) => action();
}
public Action<T1, T2, T3> CreateAction<T1, T2, T3>(Action<T1> action, T1 arg)
{
return (T1 x, T2 y, T3 z) => action(arg);
}
等等 - 換句話說,你已經完成了什么,但在一般情況下,以便代碼可以在其他地方重復使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.