Mam metodę, która przyjmuje parametry obiektu [], na przykład:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Kiedy przekazuję dwie tablice obiektów do tej metody, działa dobrze:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Ale kiedy przekazuję pojedynczy obiekt [], nie bierze on mojego obiektu [] jako pierwszego parametru, zamiast tego pobiera wszystkie jego elementy, tak jak chciałem przekazać je jeden po drugim:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Jak przekazać pojedynczy obiekt [] jako pierwszy argument do tablicy params?
params
Modyfikujący parametr podaje rozmówcy na składnie skrótów dla przekazywania wielu argumentów metody. Istnieją dwa sposoby wywołania metody zparams
parametrem:1) Wywołanie z tablicą typu parametru, w którym to przypadku
params
słowo kluczowe nie działa i tablica jest przekazywana bezpośrednio do metody:2) Lub wywołanie z rozszerzoną listą argumentów, w którym to przypadku kompilator automatycznie zawinie listę argumentów w tymczasowej tablicy i przekaże ją do metody:
Aby przekazać tablicę obiektów do metody z
params object[]
parametrem „ ”, możesz:1) Utwórz ręcznie tablicę opakowującą i przekaż ją bezpośrednio do metody, jak wspomniał lassevk :
2) Lub przerzuć argument na
object
, jak wspomniał Adam , w takim przypadku kompilator utworzy tablicę opakowującą:Jeśli jednak celem metody jest przetwarzanie wielu tablic obiektów, może być łatwiej zadeklarować ją z jawnym
params object[][]
parametrem " ". Umożliwiłoby to przekazanie wielu tablic jako argumentów:Edycja: Raymond Chen opisuje to zachowanie i jego związek ze specyfikacją C # w nowym poście .
źródło
Jest to jedno liniowe rozwiązanie obejmujące LINQ.
źródło
Musisz umieścić go w innej tablicy obiektów [], na przykład:
źródło
Inny sposób rozwiązania tego problemu (nie jest to dobra praktyka, ale wygląda pięknie):
Stosowanie:
źródło
Jedną z opcji jest to, że możesz umieścić go w innej tablicy:
Trochę brzydkie, ale ponieważ każdy element jest tablicą, nie możesz go tak po prostu rzucić, aby problem zniknął ... na przykład gdyby to było Foo (elementy obiektu params), możesz po prostu zrobić:
Alternatywnie możesz spróbować zdefiniować inną przeciążoną instancję Foo, która zajmuje tylko jedną tablicę:
źródło
źródło