Powershell v5特殊方法'New'与静态方法'New'冲突`
PowerShell v5附带了一项新功能。而不是老式的物体创造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
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的答案更好,但如果需要,您也可以使用反射来调用方法。事实上,您可以使用反射来调用任意构造函数,甚至是非公共构造函数。其他方法也是如此。