Share via


about_Calling_Generic_Methods

Les génériques vous permettent d'adapter une méthode, une classe ou une structure au type de données sur lequel elle agit. Par exemple, au lieu d’utiliser la Hashtable classe, qui permet aux clés et aux valeurs d’être de n’importe quel type, vous pouvez utiliser la Dictionary<TKey,TValue> classe générique et spécifier les types autorisés pour les propriétés clé et valeur . Les génériques offrent une meilleure réutilisation du code et la sécurité des types.

Pour certaines méthodes génériques, PowerShell peut déterminer les arguments génériques d’une méthode en déduit des arguments fournis. Toutefois, la résolution de méthode peut être compliquée lorsqu’une méthode a des surcharges génériques et non génériques, ou lorsque la méthode générique ne prend aucun paramètre formel. PowerShell peut ne pas résoudre la méthode correcte sans les arguments de méthode générique explicites.

Par exemple : [Array]::Empty<T>(). La classe .NET Array a une méthode Empty<T>() statique et générique qui ne prend aucun paramètre formel.

Avant PowerShell 7.3, pour garantir une résolution de méthode appropriée, vous devez utiliser des solutions de contournement complexes à l’aide de la réflexion .NET. Pour obtenir un exemple, consultez le billet de blog de Lee Holmes appelant des méthodes génériques sur des classes non génériques dans PowerShell.

À compter de PowerShell 7.3, vous pouvez spécifier les types d’une méthode générique.

Syntaxe

Une méthode générique est une méthode avec deux listes de paramètres : une liste de types génériques et une liste d’arguments de méthode.

Les exemples suivants montrent la nouvelle syntaxe PowerShell pour accéder à une méthode générique :

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

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

Il generic_type_arguments peut s’agir d’un type unique ou d’une liste de types séparés par des virgules, comme [string, int], y compris d’autres types génériques tels que $obj.MethodName[string, System.Collections.Generic.Dictionary[string, int]]()

Il method_arguments peut s’agir de zéro ou plus d’éléments.

Pour plus d’informations, consultez Génériques en .NET.

Exemple

Dans cet exemple, nous créons une liste d’entiers, puis utilisons la System.Linq.Enumerable classe pour énumérer les valeurs et les transformer en nouvelle valeur.

La variable $list est un objet générique List<T> qui ne peut contenir que des entiers. List<T> est une classe générique qui vous permet de spécifier le type de ses membres lorsque vous le créez. [System.Linq.Enumerable]::Select<T1,T2>(T1,T2) est une méthode générique qui nécessite deux paramètres de type générique et deux paramètres de valeur formelle.

[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

La sortie affiche chaque valeur levée à la puissance de 3.

1
8
27
64
125