通用集合作为参数

时间:2017-10-27 19:57:06

标签: powershell generics

我想使用泛型集合作为PowerShell函数的参数类型,如下所示:

function Execute-Tokenlist
{
    param([System.Collections.Generic.List[WTToken]]$Tokenlist)

}

[WTToken]只是一种自定义类型。

我使用WTToken对象创建一个新的通用集合列表:

$TokenList1 = New-Object -TypeName System.Collections.Generic.List[WTToken]

但是当我尝试调用函数

Execute-Tokenlist -Tokenlist $TokenList1

结果是ParameterBindingArgumentTransformationException,因为PowerShell将System.Collections.Generic.List`1 [WTToken]转换为新类型:

System.Collections.Generic.List`1 [[WTToken,TokenListeAuswerten.ps1,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null]]

因此,它将脚本名称作为程序集名称添加到类型名称中。

我的问题是:如何防止PowerShell进行这种类型转换?

我知道我可以使用Object作为参数类型,但我不想放弃类型检查,没有充分的理由。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,(当然)它有一个简单的解释。

Powershell包含基于类定义的任何类型的全名,包含类定义的Ps1文件的路径,或者如果定义不在ps1文件中,则包含“\ powershell”。

我的错误是我在ISE中打开一个新的脚本窗口并输入用于定义类的代码。

然后我尝试将基于该类的对象放在已经在ps1文件中定义的泛型集合中,并且具有一个Add方法,该方法使用包含ps1文件的类型来感知对象。由于新的对象类型名称不包含该ps1路径,因此我收到了对我没有意义的错误消息(现在确实如此)。

以下是完整的PowerShell脚本代码:

class WTToken
{
    [String]$Type
    [String]$Name
    [Bool]$Value
}

$TokenList = [System.Collections.Generic.List[WTToken]]::new()

$Token = [WTToken]::new()
$TokenList.Add($Token)
$TokenList.GetType().FullName

启动ISE,粘贴该代码并将其保存到ps1文件中,例如。 test.ps1并使用F5运行它。

现在打开一个新的脚本窗口并粘贴以下Powershell代码:

class WTToken
{
    [String]$Type
    [String]$Name
    [Bool]$Value
}

$Token = [WTToken]::new()
$TokenList.Add($Token)

运行此命令并显示错误消息。