保留 PowerShell 函数返回类型

2024-05-07

在我的 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就地,因为在实际代码中,初始化比本示例中的更复杂。

一种可能的解决方法是使用 C# 实现辅助函数Add-Typecommandlet,但我更愿意将我的代码保留为单一语言。


return $list

导致集合解开并被一一“输送”出去。这就是 PowerShell 的本质。

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

return ,$list
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保留 PowerShell 函数返回类型 的相关文章

随机推荐