【问题标题】:v5 special method `New` conflicts with static methods `New`v5 特殊方法 `New` 与静态方法 `New` 冲突
【发布时间】:2016-07-27 06:56:24
【问题描述】:

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

【问题讨论】:

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

标签: powershell powershell-5.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2016-11-19
    • 2012-07-14
    • 2018-10-04
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多