Ich habe eine Methode, die params object [] verwendet, wie zum Beispiel:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Wenn ich dieser Methode zwei Objektarrays übergebe, funktioniert das einwandfrei:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Wenn ich jedoch ein einzelnes Objekt [] übergebe, wird mein Objekt [] nicht als erster Parameter verwendet, sondern es werden alle Elemente so verwendet, als ob ich sie einzeln übergeben wollte:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Wie übergebe ich ein einzelnes Objekt [] als erstes Argument an ein params-Array?
Der
params
Parametermodifikator gibt Aufrufern eine Verknüpfungssyntax zum Übergeben mehrerer Argumente an eine Methode. Es gibt zwei Möglichkeiten, eine Methode mit einemparams
Parameter aufzurufen :1) Aufruf mit einem Array vom Parametertyp. In diesem Fall hat das
params
Schlüsselwort keine Auswirkung und das Array wird direkt an die Methode übergeben:2) Oder rufen Sie mit einer erweiterten Liste von Argumenten auf. In diesem Fall wird der Compiler die Liste der Argumente automatisch in ein temporäres Array einschließen und diese an die Methode übergeben:
Um ein Objektarray an eine Methode mit einem "
params object[]
" -Parameter zu übergeben, können Sie entweder:1) Erstellen Sie manuell ein Wrapper-Array und übergeben Sie dieses direkt an die Methode, wie von lassevk erwähnt :
2) Oder setzen Sie das Argument auf
object
, wie von Adam erwähnt . In diesem Fall erstellt der Compiler das Wrapper-Array für Sie:Wenn das Ziel der Methode jedoch darin besteht, mehrere Objektarrays zu verarbeiten, ist es möglicherweise einfacher, sie mit einem expliziten "
params object[][]
" -Parameter zu deklarieren . Auf diese Weise können Sie mehrere Arrays als Argumente übergeben:Bearbeiten: Raymond Chen beschreibt dieses Verhalten und wie es sich auf die C # -Spezifikation in bezieht einem neuen Beitrag .
quelle
Dies ist eine einzeilige Lösung mit LINQ.
quelle
Sie müssen es wie folgt in ein anderes Objekt [] -Array kapseln:
quelle
Ein anderer Weg, um dieses Problem zu lösen (es ist nicht so gute Praxis, sieht aber schön aus):
Verwendung:
quelle
Eine Option ist, dass Sie es in ein anderes Array einschließen können:
Etwas hässlich, aber da jedes Element ein Array ist, können Sie es nicht einfach umwandeln, um das Problem zu beheben. Wenn es beispielsweise Foo (params object items) wäre, könnten Sie einfach Folgendes tun:
Alternativ können Sie versuchen, eine andere überladene Instanz von Foo zu definieren, die nur ein einziges Array benötigt:
quelle
quelle