C# 链式调用参数函数

3
在C#中,是否可以接受params参数,然后将其作为params列表传递给另一个函数?如下所示,如果我没记错的话,下面的函数将作为类型为object的数组的单个参数传递args。这里的目标是不言自明的。
//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[] 参数。

3个回答

7
如果你调用的Call方法的签名接受一个params object[] args,那么你是错误的。它不认为args是一个object类型的单个对象,需要再次包装成数组。它认为它是整个参数列表,这正是你想要的。它会按照原样正常工作。

啊,我明白了,谢谢。所以params会将给定数组按其第一维展开以填充参数? - selkathguy
@selkathguy 不完全是这样。如果提供的类型完全匹配,则完全通过。如果不匹配,并且可以将参数视为一个项目,则将其包装在数组中。如果两者都无法实现,则不会编译。如果提供的类型与数组类型不完全匹配,则不会将其视为整个数组,而是其中的一个对象。 - Servy
那么,如果将一个包含5个对象的数组传递给像fn(object a, object b, params object[] c)这样的函数,会将其中一个对象分配给ab,其余的则被c所接收? - selkathguy
2
@selkathguy 不行。你需要传递两个对象和一个数组,或者两个对象和任意数量的其他对象。与其他一些语言不同,你不能将数组作为任意函数的参数列表传递(除非使用反射)。 - Servy
明白了。非常感谢! - selkathguy
也许你可以在另一个帖子中帮我解决这个问题的具体细节。如果你能帮忙,非常感谢!http://stackoverflow.com/questions/22817831/passing-arbitrary-arguments-from-c-sharp-to-lua-functions - selkathguy

1

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

您不需要向 params 传递多个参数。您可以直接传递一个数组。例如,以下内容完全有效:

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

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

1
可以将数组传递给另一个函数:
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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接