C# - передать расширенный массив параметров другой функции - PullRequest
0 голосов
/ 12 июля 2020

Как я могу расширить массив params при передаче его другой функции.

Рассмотрим следующий пример:

public class TestClass
{
    public static void Main()
    {
        TestParamFunc(1, "1", 1.0f, 1.0);

        Console.ReadKey();
    }

    private static void TestParamFunc(params object[] parameters)
    {
        //At the moment the DeeperTestParamFunc receives the following parameters: { int, object[] }
        //How to expand this to { int, int, string, float, double } ?
        //So that { 1, 1, "1", 1.0f, 1.0 } is received.
        DeeperTestParamFunc(1, parameters);
    }

    public static void DeeperTestParamFunc(params object[] parameters)
    {
        foreach(object obj in parameters)
        {
            Console.WriteLine(obj.GetType().ToString());
        }
    }
}

Вывод:

System.Int32
System.Object[]

Результат, который я хотел бы получить:

System.Int32
System.Int32
System.String
System.Single
System.Double

Ответы [ 3 ]

1 голос
/ 12 июля 2020

это то, что вы хотите:

    private static void TestParamFunc(params object[] parameters)
    {
        // manually create the array in the form you need
        var deeperParameters = new object[parameters.Length + 1];
        deeperParameters[0] = 1;
        parameters.CopyTo(deeperParameters, 1);            
        DeeperTestParamFunc(deeperParameters);
    }
1 голос
/ 12 июля 2020

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

Это, когда все сказано и сделано, просто массивы. params просто означает, что компилятор позволяет вам указывать аргументы индивидуально, и он превратит их в массив для вас.

Вы пишете это:

MyFuncWithParamsObjectArg(1,2,3,4,5);

Компилятор концептуально изменяет его на:

MyFuncWithParamsObjectArg(new object [] {1,2,3,4,5} );

Вот демонстрационная программа:

public static void Main()
{
    A("z", "y");
    
}

static void A(params object[] a){
    Console.WriteLine("In A()");
    
    foreach(object o in a)
        Console.WriteLine(o);
    
    object[] oo = new object[a.Length + 2];
    
    for(int i = 0; i < a.Length; i++)
        oo[i] = a[i];
    
    oo[a.Length] = "new";
    oo[a.Length + 1] = "new2";
    
    B(oo);
}

static void B(params object[] b){
    Console.WriteLine("In B()");
    
    foreach(object o in b)
        Console.WriteLine(o);
}

Распечатывает это:

In A()
z
y
In B()
z
y
new
new2

Вы можете видеть, что B был вызван с массивом на 2 длиннее, чем a, и добавлены еще два элемента

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

Если вы хотите обернуть его так, чтобы вы не сглаживали первый массив, а вместо этого создавали другие параметры массив, который имеет первый массив в качестве одного из элементов:

static void A(params object[] a){
    Console.WriteLine("In A()");
    
    foreach(object o in a)
        Console.WriteLine(o);
    
    B(a, "new1", "new2");
}

B теперь получит массив, который выглядит следующим образом:

object[] {
   object[] { "z", "y" },
   "new1",
   "new2"
}

Как отмечалось; нет magi c - компилятор смотрит на то, что вы предоставили, и если аргументы совпадают с "вызванным с помощью одномерного массива", он вызывает функцию с массивом, в противном случае он собирает различные аргументы, превращает их в массив , и вызывает его с этим массивом

B(a);                                  //a is already an object array, it is passed in verbatim
B(a, "new1", "new2");                  //a new object array is created from these 3 objects
B(new object[] {a, "new1", "new2"} );  //manually doing what the compiler does for you above
0 голосов
/ 12 июля 2020

попробуйте:

public static void DeeperTestParamFunc(params object[] parameters)
        {
            foreach (object obj in (IEnumerable) parameters[1])
            {
                Console.WriteLine(obj.GetType().ToString());
            }
        }

экземпляр:

public static void DeeperTestParamFunc(params object[] parameters)
    {
        foreach(object obj in parameters)
        {
            Console.WriteLine(obj.GetType().ToString());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...