Хорошая новость заключается в том, что PowerShell v3 намного лучше связывается с универсальными методами (и изменяет их?), И вам часто не нужно делать ничего особенного, кроме как вызывать его, как обычный метод. Я не могу указать все критерии, для которых это теперь работает, но по моему опыту некоторые ситуации с общими параметрами все еще требуют обходных путей даже в PowerShell v4 (возможно, это наличие или перегрузки или что-то подобное).
Аналогичным образом у меня иногда возникают проблемы при передаче универсального параметра в метод ... например, при передаче параметра Func<T1, T2, TResult>
.
Один обходной путь, который для меня намного проще, чем MakeGenericMethod или другие подходы, - это просто поместить быстрый класс-оболочку C # прямо в мой скрипт и позволить C # разобрать все общие отображения ...
Вот пример этого подхода, который обертывает метод Enumerable.Zip
. В этом примере мой класс c # вообще не является универсальным, но это строго не обязательно.
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);
Это производит:
f s
- -
1 a
2 b
3 c
4 d
Я уверен, что есть более эффективные способы PowerShell "сжать" два массива, но вы поняли идею. Реальная проблема, с которой я столкнулся, заключалась в том, чтобы жестко закодировать (в классе C #) 3-й параметр в Zip
, поэтому мне не пришлось выяснять, как передать этот Func<T1, T2, TResult>
(возможно, есть способ PowerShell для и что делать?).