Umgang mit generischen Listen (Teil 1)

Eine generische Collection ist der Fachbegriff für ein Array bzw. allgemein eine Liste, die nur eine bestimmte „Sorte“ von Werten aufnehmen kann. Zum Beispiel Zahlen (Int32), Zeichenketten (String) oder bestimmte Objekttypen. Der Vorteil ist, dass eine generische Liste immer nur eine Sorte von Werten besitzt. Einen zwigenden Grund gibt es für diesen Speziallfall im PowerShell-Alltag nicht. Dennoch ist es gut, dass man auch in PowerShell generische Listen anlegen kann, da es einige Methoden gibt, die diese Sorte von Parameterwert erwarten. Außerdem wäre es schade, wenn das Umsetzen von C#-Code auf PowerShell-Skript an einem solchen Detail scheitern würde.

Das Anlegen einer generischen Liste ist grundsätzlich einfach.

WTToken ist lediglich irgendein Typ, der z.B. als Klasse definiert wird.

Das Hinzufügen eines Elements geschieht per Add-Methode:

Das war einfach, jetzt wird es etwas anspruchsvoller und leider unnötig kompliziert. Der letzte Befehl fügt ein WTToken-Objekt zu einer Liste hinzu. Über den Konstruktor werden die Properties Typ und Name mit Werten belegt. Für die Property Wert gibt es keinen Konstruktorparameter, da diese Property nicht immer belegt werden soll. Möchte man der Property einen Wert zuweisen, müsste man formal zuerst eine Variable anlegen:

Das ist aber etwas umständlich. In C# gibt es dafür Objektinitialisierer mit einer einfachen Syntax:

Bei der PowerShell 6.0 gibt es diese Möglichkeit noch nicht („noch“ weil es ja nur eine Frage der Zeit ist, bis ein Vorschlag im Projektportal eingereicht bzw. eventuell sogar fertig als Pull Request eingereicht wird).

Eine eventuell naheliegende Schreibweise funktioniert leider nicht.

Der Grund ist, dass die Zuweisung zwar grundsätzlich funktioniert, dabei aber kein WTToken-Objekt resultiert, das der Add-Methode übergeben werden könnte. Auch ein weiteres in runde Klammern setzen bringt nichts, da in diesem Fall lediglich der zugewiesene Wert zurückgegeben wird. In diesem Punkt gibt es also noch Verbesserungsbedarf was das Thema Objektinitialisierer beim Anlegen eines Objekts über die statische New-Methode angeht.

Es gibt einen „Workaround“, doch leider ist dieser arg umständlich und damit keine echte Verbesserung. Dieser besteht darin, einen Scriptblock zu übergeben, in dem das Objekt angelegt wird. Da aber auch hier eine Variable benötigt wird, damit am Ende das Objekt zurückgegeben werden kann, ist das Ganze nicht besonders elegant. Im Folgenden geht es daher nur um das Prinzip bzw. ein Anschauungsbeispiel.

Wer bis hierhin mitgelesen hat (dafür erst einmal einen herzlichen Glückwunsch angesichts der etwas trockenen Thematik, es lief wohl gerade nichts Passendes im Fernsehen, auf Netflix oder irgendwo anders;), natürlich gibt es eine einfache Lösung: Das New-Object-Cmdlet und seinen Propert-Parameter, mit dessen Hilfe sich ein Objekt gleichzeitig anlegen und was einzelne Eigenschaften betrifft initialisieren lässt.

Vielleicht nicht ganz so elegant wie die moderne Schreibweise per New, aber auf alle Fälle nachvollziehbar und trotzdem alles in allem relativ einfach in der Umsetzung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.