1

PowerShell v5 带有一个新功能。而不是老式的对象创建

New-Object System.Text.StringBuilder

可以使用新语法

[System.Text.StringBuilder]::new()

新语法虽然引入了一个问题。如果一个类有一个静态方法 New,那么就不能再直接调用它了。看起来 PowerShell 认为我们将要调用构造函数,而不是这个静态方法。

我的真正问题案例无法在这里解释,所以我使用现有的类作为示例。

此代码适用于 PowerShell v4

[System.Linq.Expressions.Expression]::New([psobject])

它调用静态方法New并创建一个表达式。

在 v5 中它失败了

Cannot find an overload for "new" and the argument count: "1".
At line:1 char:5
+     [System.Linq.Expressions.Expression]::New([psobject])
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

问题是我们如何New在 PowerShell v5 中调用静态方法?

4

1 回答 1

4

PowerShell 调用构造函数时new是常量字符串标记,而不是当方法名称由表达式定义时。因此,您可以使用以下解决方法:

$New='New'
[System.Linq.Expressions.Expression]::$New([psobject])
# or
[System.Linq.Expressions.Expression]::('New')([psobject])
# or
[System.Linq.Expressions.Expression]::{New}([psobject])

此外,如果您在 之后不使用括号New,则 PowerShell 会返回PSMethod对象给您,您可以使用它的Invoke方法来调用它。

[System.Linq.Expressions.Expression]::New.Invoke([psobject])
于 2016-01-15T18:01:21.307 回答