Eu tenho um método que leva params objeto [] como:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Quando passo duas matrizes de objetos para esse método, ele funciona bem:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Mas quando passo um único objeto [], ele não leva meu objeto [] como o primeiro parâmetro; em vez disso, leva todos os seus elementos como eu queria passar um por um:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Como passo um único objeto [] como primeiro argumento para uma matriz de parâmetros?
O
params
modificador de parâmetro fornece aos chamadores uma sintaxe de atalho para passar vários argumentos para um método. Existem duas maneiras de chamar um método com umparams
parâmetro:1) Chamando com uma matriz do tipo de parâmetro; nesse caso, a
params
palavra-chave não tem efeito e a matriz é passada diretamente para o método:2) Ou, chamando com uma lista estendida de argumentos; nesse caso, o compilador quebra automaticamente a lista de argumentos em uma matriz temporária e a passa para o método:
Para passar uma matriz de objetos para um método com um
params object[]
parâmetro " ", você pode:1) Crie uma matriz de wrapper manualmente e passe-a diretamente para o método, conforme mencionado por lassevk :
2) Ou, use o argumento
object
, como mencionado por Adam , caso em que o compilador criará a matriz do wrapper para você:No entanto, se o objetivo do método é processar várias matrizes de objetos, pode ser mais fácil declará-lo com um
params object[][]
parâmetro " " explícito . Isso permitiria que você passasse várias matrizes como argumentos:Edit: Raymond Chen descreve esse comportamento e como ele se relaciona com a especificação C # em uma nova postagem .
fonte
Esta é uma solução de uma linha que envolve o LINQ.
fonte
Você precisa encapsulá-lo em outra matriz de objetos [], assim:
fonte
Outra maneira de resolver esse problema (não é uma boa prática, mas parece bonita):
Uso:
fonte
Uma opção é você pode agrupá-lo em outra matriz:
Um pouco feio, mas como cada item é uma matriz, você não pode simplesmente convertê-lo para resolver o problema ... como se fosse Foo (itens de objeto params), então você poderia fazer:
Como alternativa, você pode tentar definir outra instância sobrecarregada do Foo, que requer apenas uma única matriz:
fonte
fonte