用params方法用params调用方法

时间:2011-10-12 10:16:27

标签: c# .net params

我想做下一个:

void SomeMethod ()
{
  ParamMethod1 (1,2,3);
}

void ParamMethod1 (params object[] arg)
{
   ParamMethod2 (0, arg); //How to call ParamMethod2 in order to it works 
   //as I want
}

void ParamMethod2 (params object[] arg)
{
  //I want 'arg' contains 0,1,2,3 instead of 0, System.object[]
}

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

您可以使用LINQ执行此操作,但仍需要ToArray()

ParamMethod2(new object [] { 0 }.Concat(arg).ToArray());

编辑添加:

根据有关性能的评论,我在建议的方法之间进行了一些非常基本的性能比较。

拨打100万电话

80ms -- Direct call: ParamMethod2(0,1,2,3);
280ms -- Using CopyTo
400ms -- Using LINQ
590ms -- Using AddRange

当然,如果您将对象更改为int以及其他一些内容,则可以进一步提高性能。我个人使用LINQ,因为99%的情况下它足够快,而在另一种情况下,我不会首先使用params。

答案 1 :(得分:1)

一种方式,虽然不一定理想,但可能只是:

void ParamMethod1 (params object[] arg)
{
    var args = new List<object>();
    args.Add(0);
    if (arg != null)
    {
        args.AddRange(arg);
    }        
    ParamMethod2(args.ToArray());
}

也就是说,不管这是怎么做的,我们需要将0arg的内容组合成一个集合 - 无疑是一种更有效的方式,甚至可能是一个更简单的方法,我今天早上看不到咖啡的缺乏,但这可以解决问题,可以这么说。

答案 2 :(得分:1)

void ParamMethod1 (params object[] arg)
{
   if(arg == null || arg.Length == 0)
   {
      ParamMethod2(0);
      return;
   }
   var newArray = new int[arg.Length + 1];
   newArray[0] = 0;
   arg.CopyTo(newArray,1);
   ParamMethod2 (newArray); 
}

答案 3 :(得分:1)

更改此方法

  

void ParamMethod2(params object [] arg)   {     //我想'arg'包含0,1,2,3而不是0,System.object []   }

  

void ParamMethod2(int firstValue,params object [] arg)   {     //现在,firstvalue总是有0,剩下的传递变量将有1,2,3等。   }

希望这是你的要求。

请注意,如果您想要一个只有params作为参数的方法,那么您将遇到问题,因为您的编译器始终会调用此显式的第一个参数签名,而不是仅使用params签名方法。