如何展开另一个功能的“params”功能“params”

时间:2014-04-15 16:18:42

标签: c# function params

c#中的两个函数

void foo1(params System.Object[] list){

}

void foo2(params System.Object[] list){

}

我想展开"列表"在一个函数中,并将其发送到另一个函数。 通过展开我的意思是把列表变成     int var1,string var2,int var3 ,,, 动态地了解每个参数的类型是什么。

如果你问为什么?你会那样做吗?因为我在Unity3D Networking环境之上实现了一个通用的网络实用程序,这两个函数实际上在不同的计算机上,而Unity3d网络环境强制只发送基本类型,如" string",&# 34; Vector3"," double"等等,所以将一个列表传递给另一个列表并没有通过。

2 个答案:

答案 0 :(得分:2)

只需使用列表调用foo2

foo2(list);

编译器现在将数组作为params数组传递(与创建单元素数组相反)。

如果您首先想以某种方式计算参数,请确保在将其传递给object[]之前将其键入为foo2。也许,你必须记录你在那里做的事情。

答案 1 :(得分:0)

当您声明params AnyType[] argumentName时,C#允许您以两种方式调用它:

  • 传递可变数量的参数

    foo2(arg1, arg2, arg3)
    
  • 传递预期类型的​​数组

    foo2(new object[] { arg1, arg2, arg3 })
    

这意味着你可以将接收到的参数从一个函数传递给另一个函数而没有问题...或者如果你想以某种方式更改数组,你可以使用linq,例如,并使用{{1转换最终结果}}:

.Cast<object>().ToArray()

或者您可以将项目附加到列表中,将更多参数传递给void foo1(params System.Object[] list) { foo2(list.Where(... condition ) .Select(... select something) .Cast<object>().ToArray()); }

foo2

或前置:

void foo1(params System.Object[] list)
{
    foo2(list.Concat(new [] { "another-param" }).Cast<object>().ToArray());
}