2014-04-01 66 views
2

是否有可能在C#中接受params参数,然后将它作为params列表传递给另一个函数?现在,如果我没有弄错,下面的函数将通过args作为单个参数,它是一个object类型的数组。这里的目标是不言而喻的。C#链接参数函数调用

//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[]

回答

6

如果Call方法你调用的签名接受一个params object[] args那么你错误的。它不考虑args单个对象的衍生object,被包装在另一个数组中。它认为它是整个参数列表,这是你想要的。它会像现在一样正常工作。

+0

啊,我明白了,谢谢。那么'params'会通过它的第一维来爆炸一个给定的数组来填充参数? – selkathguy

+0

@selkathguy没有不完美。如果提供的类型完全匹配,它会精确地传递它。如果没有,并且它可以将参数视为一个项目,它会将其包装在一个数组中。如果它不能这样做,那么它将不会编译。如果提供的类型与数组类型*完全不匹配,则不会将其视为整个数组,而是将其视为整个数组。 – Servy

+0

因此,将一个由5个对象组成的单个数组传递给像'fn(object a,object b,params object [] c)'这样的函数会将一个文件写入'a'和'b'中的每一个,然后剩下的将被C? – selkathguy

1

是的,它是possible.In你的情况args actualy objects.Your Call方法的阵列应当采取params object[]或只是对象作为参数数组。

你并不需要传递一个以上的参数params。你可以传递一个数组directly.For例如,这是完全正确的:

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); 
}