タグ別アーカイブ: メソッドの実行

ジェネリック、Private、Protectedメソッドを実行する

「プライベートメンバにアクセスする」で、プライベートなメソッドを実行する Invoke-PrivateMethod をご紹介しました。
今回のスクリプトは、それの発展系で、ジェネリックメソッドに対応したものです。
一般の使用においては、プライベートメソッドの実行よりもジェネリックメソッドの実行に使われる方が多いのではないかと思い、スクリプト名を変更しています。

用例1

(1).ToString(‘D4’) と等価です。

PS> Invoke-Method (1) ToString('D4')
0001

用例2

Array.ForEach を呼び出します。

PS> $delegate = New-Delegate Action[int] {Write-Host ($args[0] * $args[0])}
PS> Invoke-Method ([Array]) ForEach([int[]](1..5), $delegate) -GenericType int
1
4
9
16
25

用例3

System.Linq.Enumerable の Repeat メソッドを呼び出します。ジェネリック型が System.Object の場合、-GenericType を省略できます。

PS> Invoke-Method ([Linq.Enumerable]) Repeat('Hello', 3)
Hello
Hello
Hello

ダウンロード


プライベートメンバにアクセスする

概要

新しいクラスを作る(3) ― コンストラクタにて、プライベートフィールドへのアクセスが冗長になることを書きました。色々と考えたのですが、他の場面で使うこともあるかもしれないと思い、外部スクリプトにすることにしました。

ダウンロード

用例

$o に「FMessage」というプライベートフィールドを持つオブジェクトが入っている時、Get-PrivateField および Set-PrivateField は、次のように使います。

PS> Set-PrivateField $o 'FMessage' 'Hello World!'
PS> Get-PrivateField $o 'FMessage'
Hello World!

また、$o が、「Add」という int 型の引数を 2 つ取るメソッドを持っている時、Invoke-PrivateMethod は、次のように使います。

PS> Invoke-PrivateMethod $o 'Add' (3, 5)
8

これらは、静的フィールドおよび静的メソッドに対しても使うことができます。