Generische Methoden aufrufen

Eine generische Methode ist eine Methode, der neben den (optionalen) Parameterwerten beim Aufruf auch ein Typ übergeben wird. Alle generischen Datentypen, die innerhalb der Methode verwendet werden inklusive dem Rückgabewert (sofern vorhanden), verwenden dann diesen Typ. Damit wird mehr Flexibilität erreicht, da die Methode nicht für jeden in Frage kommenden Datentyp überladen werden muss.

Das klassische Beispiel für eine generische Methode void swap<T>(T arg1, T arg2), welche zwei als Referenz übergebene Werte vertauscht. Mit ihr lassen sich Werte eines beliebigen Datentyps vertauschen, da dieser beim Aufruf der Methode ebenfalls angegeben wird:

swap(out a1, out a2)

In PowerShell kann man keine generischen Functions definieren und es würde auch keinen Sinn ergeben. Generische Methoden kommen immer dann ins Spiel, wenn eine Funktionalität einer externen Assembly-Bibliothek genutzt werden soll.

Dabei muss zwischen dem Aufruf einer statischen Methode und einer Instanzmethode unterschieden werden.

Es gibt im Internet (seit 2007) natürlich sehr viele Lösungen, von denen die meisten auch gut funktionieren. Eine sehr gute Lösung ist das Skript von David Wyatt, das dieser über die TechNet Script Gallery zur Verfügung stellt:

https://gallery.technet.microsoft.com/Invoke-Generic-Methods-bf7675af/view/Discussions#content

Mir ist die Lösung etwas überdimensioniert. Für einfache Anforderungen ist sehr viel weniger formaler Aufwand erforderlich. Der Aufruf einer generischen Methode läuft darauf, dass man zuerst die Methode per GetMethods() als Objekt holt, daraus per MakeGenericMethod() eine generische Methode macht, die dann per Invoke() aufgerufen wird. Eine Parameterübergabe ist natürlich kein Problem.

Die folgenden zwei Functions stelle ich ohne weitere Erläuterungen vor.

Aufruf einer generischen Instanzenmethode

function Invoke-GenericMethod
{
    param([Object]$InputObject,
          [Type]$GenericType,
          [String]$MethodName,
          [Object]$ArgumentList)
    # Wichtig: Das Filterkriterium reicht eventuell nicht immer aus -
    # es darf immer nur eine generische Methode zurückgegeben werden!
    $Method = $InputObject.GetType().GetMethods() | Where-Object { $_.Name -eq $MethodName -and $_.IsGenericMethod -eq $true}
    $MethodCall = $Method.MakeGenericMethod($GenericType)
    $MethodCall.Invoke($InputObject, $ArgumentList)
}

Aufruf einer generischen statischen Methode

function Invoke-GenericMethod
{
    param([Type]$Type,
          [Type]$GenericType,
          [String]$MethodName,
          [Object]$ArgumentList)
    $Method = $Type.GetMethod($MethodName)
    $MethodCall = $Method.MakeGenericMethod($GenericType)
    $MethodCall.Invoke($null, $ArgumentList)
}

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.