Share via


about_Calling_Generic_Methods

Los genéricos permiten personalizar un método, clase, estructura o interfaz con respecto a los datos precisos sobre los que se actúa. Por ejemplo, en lugar de usar la Hashtable clase , que permite que las claves y los valores sean de cualquier tipo, puede usar la Dictionary<TKey,TValue> clase genérica y especificar los tipos permitidos para las propiedades de clave y valor . Los genéricos proporcionan mayor reutilización de código y seguridad de tipos.

Para algunos métodos genéricos, PowerShell puede averiguar argumentos genéricos para un método mediante la inferencia de los argumentos proporcionados. Sin embargo, la resolución de métodos puede ser complicada cuando un método tiene sobrecargas genéricas y no genéricas, o cuando el método genérico no toma ningún parámetro formal. PowerShell puede no resolver el método correcto sin los argumentos explícitos del método genérico.

Por ejemplo, [Array]::Empty<T>(). La clase Array de .NET tiene un método Empty<T>() estático y genérico que no toma parámetros formales.

Antes de PowerShell 7.3, para asegurarse de que la resolución de métodos adecuada tenía que usar soluciones alternativas complicadas mediante la reflexión de .NET. Para obtener un ejemplo, consulte la entrada de blog de Lee Holmes invocación de métodos genéricos en clases no genéricas en PowerShell.

A partir de PowerShell 7.3, puede especificar los tipos de un método genérico.

Sintaxis

Un método genérico es un método con dos listas de parámetros: una lista de tipos genéricos y una lista de argumentos de método.

En los ejemplos siguientes se muestra la nueva sintaxis de PowerShell para acceder a un método genérico:

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

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

generic_type_arguments puede ser una lista de tipos únicos o separadas por comas, como [string, int], incluidos otros tipos genéricos, como$obj.MethodName[string, System.Collections.Generic.Dictionary[string, int]]()

method_arguments puede ser cero o más elementos.

Para más información, vea Elementos genéricos en .NET.

Ejemplo

En este ejemplo, creamos una lista de enteros y, a continuación, usamos la System.Linq.Enumerable clase para enumerar los valores y transformarlos en un nuevo valor.

La variable $list es un objeto genérico List<T> que solo puede contener enteros. List<T> es una clase genérica que permite especificar el tipo de sus miembros al crearlo. [System.Linq.Enumerable]::Select<T1,T2>(T1,T2) es un método genérico que requiere dos parámetros de tipo genérico y dos parámetros de valor formal.

[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 salida muestra cada valor elevado a la potencia de 3.

1
8
27
64
125