C#链接参数函数调用

C#链接参数函数调用,c#,wrapper,params,C#,Wrapper,Params,在C#中是否可以接受params参数,然后将其作为params列表传递给另一个函数?目前,如果我没有弄错的话,下面的函数将作为一个参数传递args,该参数是object类型的数组。这里的目标是不言而喻的 //ScriptEngine public object[] Call(string fnName, params object[] args) { try{ return lua.GetFunction(fnName).Call(args); } cat

在C#中是否可以接受
params
参数,然后将其作为
params
列表传递给另一个函数?目前,如果我没有弄错的话,下面的函数将作为一个参数传递
args
,该参数是
object
类型的数组。这里的目标是不言而喻的

//ScriptEngine
public object[] Call(string fnName, params object[] args)
{
    try{
        return lua.GetFunction(fnName).Call(args);
    }
    catch (Exception ex)
    {
        Util.Log(LogManager.LogLevel.Error, "Call to Lua failed: "+ex.Message);
    }
    return null;
}

lua.GetFunction(fnName.Call)(args)
是对我的代码之外的对象的调用,它接受
param object[]

是的,这是可能的。在您的情况下,
args
实际上是一个对象数组。您的
调用
方法应该以
params object[]
或仅仅是一个对象数组作为参数

您不需要将多个参数传递给
params
。您可以直接传递数组。例如,这是完全有效的:

public void SomeMethod(params int[] args) { ... }

SomeMethod(new [] { 1, 2, 3 });

可以将数组传递给另一个函数:

void Main()
{   
    int[] input = new int[] {1,2,3};
    first(input); //Prints 3
}

public void first(params int[] args)
{
    second(args);
}

public void second(params int[] args)
{
    Console.WriteLine(args.Length);
}

如果您正在调用的
Call
方法的签名接受
params object[]args
,那么您就错了。它不考虑<代码> ARGs<代码>一个THPE <代码>对象< /代码>的对象,被封装在另一个数组中。它认为它是整个参数列表,这就是您想要的。它会像现在一样正常工作。

啊,我明白了,谢谢。因此,
params
将给定数组按其第一个维度分解以填充参数?@selkathguy不完全是这样。如果提供的类型完全匹配,它将完全传递它。如果没有,并且可以将参数视为一项,则将其包装在数组中。如果两者都不行,那么它就不会编译。如果提供的类型与数组类型不完全匹配,则它不会将其视为整个数组,而是其中的一个对象。因此,将一个包含5个对象的数组传递给函数,如
fn(对象a、对象b、参数对象[]c)
,将在
a
b
中分别提交一个,那么剩下的将被c吃掉?@selkathguy不。这不会编译。您需要传递两个对象和一个数组,或者传递两个对象和任意数量的附加对象。与其他一些语言不同,您不能将数组作为任意函数的参数列表传递(不使用反射)。明白了。非常感谢你!