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

PowerShellnewは、メソッド名が式で定義されている場合ではなく、定数文字列トークンの場合にコンストラクターを呼び出します。したがって、次の回避策を使用できます。

$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 に答える