C #, передать массив в качестве параметров функции - PullRequest
5 голосов
/ 07 января 2010

В python * позволяет мне передавать список в качестве параметров функции:

def add(a,b): return a+b
x = [1,2]
add(*x)

Можно ли воспроизвести это поведение в C # с массивом?

Спасибо.

Ответы [ 4 ]

12 голосов
/ 07 января 2010

Ключевое слово params допускает нечто подобное

public int Add(params int[] numbers) {
    int result = 0;

    foreach (int i in numbers) {
        result += i;
    }

    return result;
}

// to call:
int result = Add(1, 2, 3, 4);
// you can also use an array directly
int result = Add(new int[] { 1, 2, 3, 4});
9 голосов
/ 07 января 2010

За исключением:

  1. Изменение сигнатуры метода для принятия массива
  2. Добавление перегрузки, которая принимает массив, извлекает значения и вызывает исходную перегрузку
  3. Используя рефлексию для вызова метода

, тогда, к сожалению, нет, вы не можете этого сделать.

Передача параметров на основе ключевых слов и позиций, как в Python, не поддерживается в .NETЗа исключением размышлений.

Обратите внимание, что, вероятно, есть несколько веских причин, почему это не поддерживается, но одна, которая приходит мне в голову, это просто «зачем вам это нужно?».Как правило, этот шаблон используется только при переносе метода на другой уровень, а в .NET у вас есть строго типизированные делегаты, поэтому, как правило, все, что остается, - это код на основе отражений, и даже в этом случае вы обычно обладаете сильным контролемвызываемый метод.

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

Вот пример использования отражения:

using System;
using System.Reflection;

namespace ConsoleApplication1
{
    class Program
    {
        public Int32 Add(Int32 a, Int32 b) { return a + b; }
        static void Main(string[] args)
        {
            Program obj = new Program();

            MethodInfo m = obj.GetType().GetMethod("Add");
            Int32 result = (Int32)m.Invoke(obj, new Object[] { 1, 2 });
        }
    }
}
2 голосов
/ 07 января 2010

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

1 голос
/ 07 января 2010

Я вполне уверен, что вы можете использовать отражение для доступа к своему методу, а затем использовать Invoke , используя ваш массив в качестве списка параметров. Вид вокруг, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...