代码之家  ›  专栏  ›  技术社区  ›  Seb Nilsson

C#Action和Func参数重载

  •  7
  • Seb Nilsson  · 技术社区  · 14 年前

    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特定的特性来解决这个问题。

    2 回复  |  直到 14 年前
        1
  •  8
  •   Ruben Bartelink    14 年前

    同样,除了执行 动作及其参数。

    因为用枪而尖叫 higher order function ,但是由于您已经参数化了所有正在更改的位(操作及其参数的执行),所以您已经在那里了。抱歉,看起来您必须手动实现这些重载。

    将传递的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();
    }
    
        2
  •  5
  •   Dan Tao    14 年前

    这实际上是最好的方法(记住Johannes的观点,您也可以使用高阶函数),因为它是最友好的类型(委托将自动与正确数量和类型的参数匹配),并且不需要任何麻烦 DynamicInvoke

    但是,上一个方法定义有问题。安 Action 就其本质而言,它不接受任何参数,因此它不会与 params object[] 争论。如果你想要一个接受可变数量参数的最终重载,我同意 毕竟,对于这个方法调用:

    public void Execute(Delegate action, params object[] parameters)
    {
        DoStuff();
        action.DynamicInvoke(parameters);
        DoMoreStuff();
    }
    

    但为了进一步说明Johannes所说的,我认为他基本上是在说这样的话:

    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);
    }