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

Powershell v5特殊方法'New'与静态方法'New'冲突`,powershell,powershell-5.0,Powershell,Powershell 5.0,PowerShell v5附带了一项新功能。而不是老式的物体创造 New-Object System.Text.StringBuilder 可以使用新语法 [System.Text.StringBuilder]::new() 不过,新语法引入了一个问题。如果一个类有一个静态方法 New则不能再直接调用它。看起来像是地狱 认为我们要调用构造函数,而不是这个静态方法 我真正的问题案例在这里无法解释,所以我使用了一个现有的类 举个例子 此代码在PowerShell v4中工作 [System.Li

PowerShell v5附带了一项新功能。而不是老式的物体创造

New-Object System.Text.StringBuilder
可以使用新语法

[System.Text.StringBuilder]::new()
不过,新语法引入了一个问题。如果一个类有一个静态方法
New
则不能再直接调用它。看起来像是地狱 认为我们要调用构造函数,而不是这个静态方法

我真正的问题案例在这里无法解释,所以我使用了一个现有的类 举个例子

此代码在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
是常量字符串标记时,而不是当方法名称由表达式定义时,我们如何调用静态方法
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])

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

把它贴出来作为回答,如果没有更好的,我会接受的。但这已经很好了。谢谢。第二个是“更好”,它同样适用于v2。PerSerAl的答案更好,但如果需要,您也可以使用反射来调用方法。事实上,您可以使用反射来调用任意构造函数,甚至是非公共构造函数。其他方法也是如此。将其作为答案发布,如果没有更好的答案,我将接受它。但这已经很好了。谢谢。第二个是“更好”,它同样适用于v2。PerSerAl的答案更好,但如果需要,您也可以使用反射来调用方法。事实上,您可以使用反射来调用任意构造函数,甚至是非公共构造函数。其他方法也是如此。