保留PowerShell函数返回类型

时间:2016-07-08 00:41:38

标签: powershell casting

在我的PowerShell脚本中,我需要使用以下签名调用.NET方法:

class CustomList : System.Collections.Generic.List<string> { }

interface IProcessor { void Process(CustomList list); }

我做了一个帮助函数来生成列表:

function ConvertTo-CustomList($obj)
{
    $list = New-Object CustomList
    if ($obj.foo) {$list.Add($obj.foo)}
    if ($obj.bar) {$list.Add($obj.bar)}
    return $list
}

然后我调用方法:

$list = ConvertTo-CustomList(@{'foo'='1';'bar'='2'})
$processor.Process($list)

但是,调用失败并出现以下错误:

Cannot convert argument "list", with value: "System.Object[]", for "Process" to type "CustomList"
+ CategoryInfo          : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

因此PowerShell由于某种原因将带有两个项目的CustomList转换为带有两个项目的object[],并且无法在方法调用时将其转换回来。如果我致电ConvertTo-CustomList(@{'foo'='1'}),则只返回string

我试图在这里和那里放置一个演员,但这没有帮助,在函数返回后执行失败。

那么如何强制ConvertTo-CustomList函数返回原始CustomList?我不想原位初始化CustomList因为在实际代码中初始化比这个例子更复杂。

一种可能的解决方法是使用Add-Type命令行开关在C#中实现辅助函数,但我更希望将代码保留为单一语言。

1 个答案:

答案 0 :(得分:11)

return $list

导致集合解开并逐个“管道化”。这就是PowerShell的本质。

您可以使用一元数组运算符,将输出变量本身包装在一个单项数组中来阻止这种情况:

return ,$list