2013-02-26 91 views
1

我有一個方法C#呼叫的方法與對象(params對象[] [])[]和對象[] []作爲參數

public void method(params object[][] arg) 

但是,在我調用該方法,我已經和對象[]和對象[] []:

object[] var1 = new object[5]; 
object[][] var2 = new object[8][5]; 
method(var1, var2); (I´d like this to be method(var1, var2[0], var2[1], var2[2],...) 

但是內部的方法,精氨酸具有長度爲2:

arg[0] = var1 
arg[1] = var2 

但我想ARG作爲長度9的數組:

arg[0] = var1 
arg[1] = var2[0]; 
arg[2] = var2[1]; 
... 

我該如何調用該方法?

回答

3

這聽起來像你想:

object[][] args = new[] { var1 }.Concat(var2).ToArray(); 
method(args); 

「正常」參數數組的C#處理沒有做任何平整:你要麼與已經正確類型的單個參數調用它, 你可以用一系列元素類型的參數來調用它。你不能混合搭配。

1

一般而言,對於接受params陣列I還提供了接受IEnumerable<T>過載的方法:

public void MyMethod(params string[] args) 
{ 
    MyMethod((IEnumerable<string>)args); 
} 

public void MyMethod(IEnumerable<string> args) 
{ 
    // ... 
} 

那麼你也可以很容易地提供可枚舉作爲參數。例如:

string[] var1 = new string[5]; 
string[][] var2 = new string[8][5]; 

// Jon Skeet's suggestion without ToArray(): 
var sequence = new[] { var1 }.Concat(var2); 
MyMethod(sequence); 

如果你真的想使用你建議的語法,你能做到這一點,因爲在您的例子中,你使用object[]。對象數組也是一個對象,因此您可以在裏面展平您的方法:

public void MyMethod(params object[] args) 
{ 
    object[] flattened = arg 
     // For each element that is not in an array, put it in an array. 
     .Select(a => a is object[] ? (object[])a : new object[] { a }) 
     // Select each element from each array. 
     .SelectMany(a => a) 
     // Make the resulting sequence into an array. 
     .ToArray(); 
    // ... 
} 

MyMethod(var1, var2);