Вызов метода с параметрами из метода с параметрами - PullRequest
2 голосов
/ 12 октября 2011

Я хочу сделать следующее:

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 ]

2 голосов
/ 12 октября 2011

Вы можете сделать это с помощью LINQ, но вам все еще нужен ToArray ()

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

Отредактировано для добавления:

Основываясь на комментарии, касающемся производительности, я провел несколько базовых сравнений производительности между предлагаемыми методами.

На 1 миллион звонков

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

Конечно, если вы изменили объект на int и несколько других вещей, вы улучшите производительность в дальнейшем. Лично я бы использовал LINQ, потому что это достаточно быстро для 99% случаев, а в другом случае я бы не стал использовать params.

1 голос
/ 12 октября 2011

Изменить этот метод

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 и т. Д.}

Надеюсь, это то, о чем вы просите.

Обратите внимание, что у вас возникнет проблема, если вы захотите использовать метод только с параметрами в качестве аргументов,потому что всегда ваш компилятор будет вызывать эту явную сигнатуру первого аргумента, чем метод сигнатуры только для параметра.

1 голос
/ 12 октября 2011
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); 
}
1 голос
/ 12 октября 2011

Одним из способов, хотя и не обязательно идеальным, может быть просто:

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

То есть, независимо от того, как это делается, нам нужно объединить 0 и содержимое arg в одну коллекцию - несомненно, будет более эффективный способ и, возможно, даже более простой подход, который Я не вижу отсутствия кофе сегодня утром, но это, так сказать, поможет.

...