好消息是,PowerShell v3 在绑定通用方法(并具体化它们?)方面更加出色,你通常不需要做任何特殊的事情,只需像调用普通方法一样调用它即可。我无法指定所有现在适用于此的标准,但根据我的经验,在带有通用参数的某些情况下,即使在 PowerShell v4 中仍然需要解决问题(也许是存在或重载或类似的东西)。
同样地,我有时也难以将通用参数传递给方法...例如传递一个 Func 参数。
对我来说,与 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#类中硬编码第三个参数到Zip
,这样我就不必想办法传递Func<T1, T2, TResult>
(也许也有一种PowerShell的方法可以做到这一点?)。
[Sample]::MyMethod[string]("测试消息");
。 - Granger