C# - 将扩展的参数数组传递给另一个函数
C# - pass on expanded params array to another function
如何在将 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
你创建一个新数组,将现有参数复制到其中,添加更多内容并使用更大的数组调用另一个方法
归根结底,这些只是数组。 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是用一个比a长2的数组调用的,又加了两个元素
请注意,您不能“扩展”数组,无论它是否为参数。您必须创建一个新数组,将内容复制过来,然后从那里开始
如果您希望将其包装起来,这样您就不会展平第一个数组,而是创建另一个将第一个数组作为其元素之一的参数数组:
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"
}
如前所述;没有什么神奇的——编译器会查看你提供的内容,如果参数匹配“用一维数组调用”,那么它会用数组调用函数,否则它会收集各种参数,把它们变成一个数组,然后调用它与那个数组
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
尝试:
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());
}
}
这就是你想要的:
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);
}
如何在将 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
你创建一个新数组,将现有参数复制到其中,添加更多内容并使用更大的数组调用另一个方法
归根结底,这些只是数组。 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是用一个比a长2的数组调用的,又加了两个元素
请注意,您不能“扩展”数组,无论它是否为参数。您必须创建一个新数组,将内容复制过来,然后从那里开始
如果您希望将其包装起来,这样您就不会展平第一个数组,而是创建另一个将第一个数组作为其元素之一的参数数组:
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"
}
如前所述;没有什么神奇的——编译器会查看你提供的内容,如果参数匹配“用一维数组调用”,那么它会用数组调用函数,否则它会收集各种参数,把它们变成一个数组,然后调用它与那个数组
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
尝试:
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());
}
}
这就是你想要的:
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);
}