14

たとえば$m、次のメソッド オーバーロードを持つ .NET オブジェクトがあります。

PS C:\Users\Me> $m.GetBody

OverloadDefinitions
-------------------    
T GetBody[T]() 
T GetBody[T](System.Runtime.Serialization.XmlObjectSerializer serializer)  

パラメーターなしのメソッドを呼び出そうとすると、次のようになります。

PS C:\Users\Me> $m.GetBody()
Cannot find an overload for "GetBody" and the argument count: "0".
At line:1 char:1
+ $m.GetBody()
+ ~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

PowerShell v3.0 はジェネリックでより簡単に動作することになっていることを理解しています。明らかに、返される型を何らかの形で伝える必要がありますが、構文がわかりません。

4

4 に答える 4

4

オブジェクトインスタンスでジェネリック メソッドを呼び出す:

$instance.GetType().GetMethod('MethodName').MakeGenericMethod([TargetType]).Invoke($instance, $parameters)

静的ジェネリック メソッドの呼び出し(「 PowerShell でのジェネリック静的メソッドの呼び出し」も参照):

[ClassType].GetMethod('MethodName').MakeGenericMethod([TargetType]).Invoke($null, $parameters)

AmbiguousMatchExceptionメソッドの非ジェネリック バージョンも存在する場合に発生することに注意してください( .NET で GetMethod を使用して、ジェネリック シグネチャと非ジェネリック シグネチャを区別するにはどうすればよいですか? を参照してください)。GetMethods()次に使用します。

([ClassType].GetMethods() | where {$_.Name -eq "MethodName" -and $_.IsGenericMethod})[0].MakeGenericMethod([TargetType]).Invoke($null, $parameters)

(上記のフィルタに一致するメソッドが複数存在する可能性があることに注意してください。そのため、必要なものを見つけるために必ず調整してください。)

ヒント: 次のような複雑なジェネリック型リテラルを記述できます (「Powershell でのジェネリック型のジェネリック型」を参照)。

[System.Collections.Generic.Dictionary[int,string[]]]
于 2016-04-14T08:28:50.190 に答える