v5特殊方法`New`与静态方法`New`冲突

时间:2016-01-15 16:53:27

标签: powershell powershell-v5.0

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

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

1 个答案:

答案 0 :(得分:4)

new是常量字符串标记时,

PowerShell调用构造函数,而不是表达式定义的方法名称时。因此,您可以使用以下解决方法:

$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])