Dela via


about_Calling_Generic_Methods

Med generiska data kan du skräddarsy en metod, klass, struktur eller ett gränssnitt efter den exakta datatyp som den fungerar på. I stället för att till exempel använda klassen Hashtable , som gör att nycklar och värden kan vara av valfri typ, kan du använda den Dictionary<TKey,TValue> allmänna klassen och ange vilka typer som tillåts för nyckel - och värdeegenskaperna . Generiska läkemedel ger ökad återanvändning av kod och typsäkerhet.

För vissa generiska metoder kan PowerShell räkna ut generiska argument för en metod genom att härleda från de angivna argumenten. Metodmatchning kan dock vara komplicerat när en metod har både generiska och icke-generiska överlagringar, eller när den generiska metoden inte tar någon formell parameter. PowerShell kan misslyckas med att matcha rätt metod utan explicita allmänna metodargument.

Till exempel [Array]::Empty<T>(). . NET-matrisklassen har en statisk, generisk metod Empty<T>() som inte tar några formella parametrar.

Före PowerShell 7.3 var du tvungen att använda komplicerade lösningar med hjälp av .NET-reflektion för att säkerställa korrekt metodmatchning. Ett exempel finns i Lee Holmes blogginlägg Invoking generic methods on non-generic classes in PowerShell (Anropa generiska metoder på icke-generiska klasser i PowerShell).

Från och med PowerShell 7.3 kan du ange typerna för en generisk metod.

Syntax

En generisk metod är en metod med två parameterlistor: en lista över generiska typer och en lista med metodargument.

I följande exempel visas den nya PowerShell-syntaxen för åtkomst till en generisk metod:

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

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

generic_type_arguments kan vara en enskild typ eller kommaavgränsad lista med typer, till exempel [string, int], inklusive andra generiska typer som$obj.MethodName[string, System.Collections.Generic.Dictionary[string, int]]()

method_arguments kan vara noll eller flera objekt.

Mer information finns i Allmänt i .NET.

Exempel

I det här exemplet skapar vi en lista med heltal och använder System.Linq.Enumerable sedan klassen för att räkna upp värdena och omvandla dem till ett nytt värde.

Variabeln $list är ett allmänt List<T> objekt som bara kan innehålla heltal. List<T> är en allmän klass där du kan ange typen av medlemmar när du skapar den. [System.Linq.Enumerable]::Select<T1,T2>(T1,T2) är en allmän metod som kräver två generiska typparametrar och två formella värdeparametrar.

[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

Utdata visar varje värde som höjs till 3.

1
8
27
64
125