Share via


about_Calling_Generic_Methods

Mit Generics können Sie eine Methode, Klasse, Struktur oder Schnittstelle genau an den Datentyp anpassen, der von ihnen verarbeitet wird. Statt beispielsweise die Klasse zu verwenden, mit der Hashtable Schlüssel und Werte beliebiger Art verwendet werden können, können Sie die Dictionary<TKey,TValue> generische Klasse verwenden und die für die Schlüssel - und Werteigenschaften zulässigen Typen angeben. Generika bieten eine höhere Wiederverwendbarkeit von Code und Typsicherheit.

Bei einigen generischen Methoden kann PowerShell generische Argumente für eine Methode ermitteln, indem sie von den bereitgestellten Argumenten abgeleitet wird. Die Methodenauflösung kann jedoch kompliziert sein, wenn eine Methode über generische und nicht generische Überladungen verfügt oder wenn die generische Methode keinen formalen Parameter verwendet. PowerShell kann die richtige Methode ohne die expliziten generischen Methodenargumente nicht auflösen.

Beispiel: [Array]::Empty<T>(). Die .NET Array-Klasse verfügt über eine statische generische Methode Empty<T>() , die keine formalen Parameter akzeptiert.

Bevor Sie PowerShell 7.3 verwenden mussten, um die richtige Methodenauflösung sicherzustellen, mussten Sie komplizierte Problemumgehungen mit .NET-Spiegelung verwenden. Ein Beispiel hierfür finden Sie im Blogbeitrag Lee Holmes: Aufrufen generischer Methoden für nicht generische Klassen in PowerShell.

Ab PowerShell 7.3 können Sie die Typen für eine generische Methode angeben.

Syntax

Eine generische Methode ist eine Methode mit zwei Parameterlisten: eine Liste generischer Typen und eine Liste von Methodenargumenten.

Die folgenden Beispiele zeigen die neue PowerShell-Syntax für den Zugriff auf eine generische Methode:

# static generic methods
[type_name]::MethodName[generic_type_arguments](method_arguments)

# instance generic methods
$object.MethodName[generic_type_arguments](method_arguments)

Dies generic_type_arguments kann eine einzelne Typ- oder kommagetrennte Liste von Typen sein, z [string, int]. B. einschließlich anderer generischer Typen wie $obj.MethodName[string, System.Collections.Generic.Dictionary[string, int]]()

Dies method_arguments kann null oder mehr Elemente sein.

Weitere Informationen finden Sie unter Generics in .NET.

Beispiel

In diesem Beispiel erstellen wir eine Liste ganzzahliger Zahlen und verwenden dann die System.Linq.Enumerable Klasse, um die Werte aufzulisten und in einen neuen Wert zu transformieren.

Die Variable $list ist ein generisches List<T> Objekt, das nur ganze Zahlen enthalten kann. List<T> ist eine generische Klasse, mit der Sie den Typ der Member angeben können, wenn Sie sie erstellen. [System.Linq.Enumerable]::Select<T1,T2>(T1,T2) ist eine generische Methode, die zwei generische Typparameter und zwei formale Wertparameter erfordert.

[System.Collections.Generic.List[int]]$list = @( 1, 2, 3, 4, 5 )
$result = [System.Linq.Enumerable]::Select[int, float](
    $list,
    [Func[int, float]]{
        param($item)
        [math]::Pow($item, 3)
    }
)
$result

Die Ausgabe zeigt jeden Wert an, der auf die Potenz von 3 erhöht wird.

1
8
27
64
125