2014-04-01 90 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); 
}