ジェネリックを使用すると、操作対象のデータ型に厳密に合わせてメソッド、クラス、構造体、またはインターフェイスを調整できます。 たとえば、キーと値を任意の型にできる System.Collections.Hashtable クラスを使用する代わりに、 System.Collections.Generic.Dictionary ジェネリック クラスを使用し、 キー と 値 のプロパティに許可される型を指定できます。 ジェネリックにより、コードの再利用性と型の安全性が向上します。
一部のジェネリック メソッドでは、PowerShell は、指定された引数から推論することで、メソッドのジェネリック引数を把握できます。 ただし、メソッドがジェネリック オーバーロードと非ジェネリック オーバーロードの両方を持つ場合や、ジェネリック メソッドが仮パラメーターを受け取っていない場合は、メソッドの解決が複雑になる可能性があります。 PowerShell は、明示的なジェネリック メソッド引数なしで正しいメソッドを解決できない場合があります。
たとえば、[array]::Empty[T]()
のようにします。 .NET Array クラスには、仮パラメーターを受け取たない静的なジェネリック メソッド Empty[T]()
があります。
PowerShell 7.3 より前のバージョンでは、適切なメソッド解決を確保するために、.NET リフレクションを使用して複雑な回避策を使用する必要がありました。 例については、PowerShell の非ジェネリック クラス ジェネリック メソッドのInvoking に関する Lee Holmes のブログ投稿を参照してください。
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
PowerShell