代码之家  ›  专栏  ›  技术社区  ›  Homam

我可以在Action或Func委托中使用params吗?

  •  38
  • Homam  · 技术社区  · 14 年前

    private Action<string, params object[]> WriteToLogCallBack;
    

    我收到此设计时错误:

    类、结构或接口成员声明中的标记“params”无效

    任何帮助!

    5 回复  |  直到 14 年前
        1
  •  41
  •   CodesInChaos    14 年前

    这个解决办法怎么样?

    private Action<string, object[]> writeToLogCallBack;
    public void WriteToLogCallBack(string s, params object[] args)
    {
      if(writeToLogCallBack!=null)
        writeToLogCallBack(s,args);
    }
    

    或者可以定义自己的委托类型:

    delegate void LogAction(string s, params object[] args);
    
        2
  •  11
  •   Jordão    14 年前

    变量类型参数在C中不可能。

    所以有很多声明 Action<...> , Func<...> ,和 Tuple<...> has them .

        3
  •  5
  •   Bryan Clark    7 年前

    你可以试试这个。它允许任意数量的参数,如果传递了错误数量或类型的参数,则会出现编译时错误。

    public delegate T ParamsAction<T>(params object[] oArgs);
    
    public static T LogAction<T>(string s, ParamsAction<T> oCallback)
    {
        Log(s);
        T result = oCallback();
        return T;
    }
    
    Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1));
    
        4
  •  3
  •   Gordon Gustafson    14 年前

    你可以用 params 在委托的实际声明中,但不是在类型中。操作的泛型参数只是类型,而不是调用委托时要传递的实际参数。params不是类型,而是关键字。

        5
  •  0
  •   kamgman    6 年前


    我正使用此方法将包含数据库调用的多个方法包装到单个事务中。
    谢谢布莱恩:-)
    (您可以在LINQPad中运行以下命令进行测试)

    //Wrapper code
    public delegate void MyAction(params object[] objArgs);
    public static void RunActions(params MyAction[] actnArgs)
    {
        Console.WriteLine("WrapperBefore: Begin transaction code\n");
        actnArgs.ToList().ForEach( actn =>  actn() );
        Console.WriteLine("\nWrapperAfter: Commit transaction code");
    }
    
    //Methods being called
    public void Hash  (string s, int i, int j)  => Console.WriteLine("   Hash-method call: " + s + "###" + i.ToString() + j.ToString());
    public void Slash (int i, string s)         => Console.WriteLine("   Slash-method call: " + i.ToString()+ @"////" + s);
    
    //Actual calling code
    void Main()
    {  
      RunActions( objArgs => Hash("One", 2, 1)
                 ,objArgs => Slash(3, "four")   );
    }
    
    //Resulting output: 
    // 
    //  WrapperBefore: Begin transaction code
    //  
    //  Hash-method call: One###21
    //  Slash-method call: 3////four
    //  
    //  WrapperAfter: Commit transaction code