La buena noticia es v3 PowerShell es mucho mejor en la unión a métodos genéricos (y reificarlos?) y a menudo no tienes que hacer nada especial, pero llámalo como lo harías con un método normal. No puedo especificar todos los criterios para los que esto funciona ahora, pero en mi experiencia ciertas situaciones con parámetros genéricos aún requieren soluciones incluso en PowerShell v4 (tal vez sea la existencia o sobrecargas o algo similar).
De manera similar, a veces también tengo problemas para pasar un parámetro genérico a un método ... por ejemplo, pasar un parámetro Func<T1, T2, TResult>
.
Una solución alternativa que para mí es mucho más simple que MakeGenericMethod u otros enfoques es que sólo hay que poner una clase rápida C# envoltorio directamente en mi guión, y sea C# clase toda la asignación genérica ...
Aquí es un ejemplo de este enfoque que envuelve el método Enumerable.Zip
. En este ejemplo, mi clase C# no es genérica, pero eso no es estrictamente necesario.
Add-Type @'
using System.Linq;
public class Zipper
{
public static object[] Zip(object[] first, object[] second)
{
return first.Zip(second, (f,s) => new { f , s}).ToArray();
}
}
'@
$a = 1..4;
[string[]]$b = "a","b","c","d";
[Zipper]::Zip($a, $b);
Esto produce:
f s
- -
1 a
2 b
3 c
4 d
Estoy seguro de que hay mejores maneras de PowerShell a "zip" dos matrices pero se entiende la idea. El verdadero desafío que esquivé aquí fue tener un tercer parámetro codificado (en la clase C#) en Zip
, así que no tuve que descubrir cómo pasar ese Func<T1, T2, TResult>
(Tal vez también hay una forma de hacerlo con PowerShell). ?).
Lo siento pero resisto mi declaración - 'no se puede hacer * directamente * en PowerShell'. :-) Awesome work-around BTW ... pero realmente, el equipo de PowerShell necesita arreglar este agujero. –
Acuerde con Keith que sería bueno tener soporte incorporado para esto, pero como esta es una solución (incluso si no es directa), esta respuesta se lleva el tic. –
El código de muestra largo no es necesario para direccionar OP, MakeGenericMethod es suficiente. – JohnC