about_Calling_Generic_Methods
ジェネリックを使用すると、操作対象のデータ型に厳密に合わせてメソッド、クラス、構造体、またはインターフェイスを調整できます。 たとえば、キーと値を任意の型にできる Hashtable クラスを使用する代わりに、ジェネリック クラスを Dictionary<TKey,TValue>
使用し、 キー と 値 のプロパティに許可される型を指定できます。 ジェネリックは、コードの再利用性と型の安全性を向上します。
一部のジェネリック メソッドでは、PowerShell は、指定された引数から推論することで、メソッドのジェネリック引数を把握できます。 ただし、メソッドにジェネリック オーバーロードと非ジェネリック オーバーロードの両方がある場合、またはジェネリック メソッドが仮パラメーターを受け取っていない場合は、メソッドの解決が複雑になる可能性があります。 PowerShell では、明示的なジェネリック メソッド引数なしで正しいメソッドを解決できない場合があります。
たとえば、「 [Array]::Empty<T>()
」のように入力します。 .NET Array クラスには、正式なパラメーターを受け取る静的なジェネリック メソッド Empty<T>()
があります。
PowerShell 7.3 より前のバージョンでは、適切なメソッド解決を確保するために、.NET リフレクションを使用して複雑な回避策を使用する必要がありました。 例については、Lee Holmes のブログ記事「 PowerShell での非ジェネリック クラスでのジェネリック メソッドの呼び出し」を参照してください。
PowerShell 7.3 以降では、ジェネリック メソッドの型を指定できます。
構文
ジェネリック メソッドは、ジェネリック型のリストとメソッド引数のリストという 2 つのパラメーター リストを持つメソッドです。
次の例は、ジェネリック メソッドにアクセスするための新しい PowerShell 構文を示しています。
# static generic methods
[type_name]::MethodName[generic_type_arguments](method_arguments)
# instance generic methods
$object.MethodName[generic_type_arguments](method_arguments)
には generic_type_arguments
、1 つの型またはコンマ区切りの型のリストを指定できます 。たとえば、 などの [string, int]
他のジェネリック型も含まれます。 $obj.MethodName[string, System.Collections.Generic.Dictionary[string, int]]()
には method_arguments
、0 個以上の項目を指定できます。
詳細については、「.NET のジェネリック」を参照してください。
例
この例では、整数のリストを作成し、 クラスを System.Linq.Enumerable
使用して値を列挙し、新しい値に変換します。
変数 $list
は、整数のみを含めることができるジェネリック List<T>
オブジェクトです。 List<T>
は、作成時にメンバーの型を指定できるジェネリック クラスです。
[System.Linq.Enumerable]::Select<T1,T2>(T1,T2)
は、2 つのジェネリック型パラメーターと 2 つの仮値パラメーターを必要とするジェネリック メソッドです。
[System.Collections.Generic.List[int]]$list = @( 1, 2, 3, 4, 5 )
$result = [System.Linq.Enumerable]::Select[int, float](
$list,
[Func[int, float]]{
param($item)
[math]::Pow($item, 3)
}
)
$result
出力には、3 の累乗に引き上げられた各値が表示されます。
1
8
27
64
125