簡體   English   中英

C#Action和Func參數重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM