Powershell内で書いたC#で書いたクラスを使うということで、コンストラクターやプロパティの利用について書いてみます。前回のPowerShellスクリプト内でC#コードを書いて使う - YOMON8.NETで書いた内容への付け足しになります。
元になるC#のクラス
今回はコンストラクターやプロパティがPowershellからどう使われるかを書きたいので、それらを実装した単純なクラスを書きます。
public class MyClass { //変数nは通常のPublicなフィールド public int n; //変数mはPropertyを使用して値を5より大きく縛る private int m; public int M { get { return m; } set { if (value > 5) m = value; else m = 5; } } //コンストラクター public MyClass(int n, int m) { this.n = n; M = m; } public int MyCulc() { return n + m; } }
Powershell内でC#クラスを実装
まずはコマンドレットのAdd-Typeを利用して、C#のクラスを取り込みます。@""@で囲んでそのままコードのテキストを張り付ければOKです。
Add-Type -TypeDefinition @" public class MyClass { //変数nは通常のPublicなフィールド public int n; //変数mはPropertyを使用して最小値を5としている private int m; public int M { get { return m; } set { if (value > 5) m = value; else m = 5; } } //コンストラクター public MyClass(int n, int m) { this.n = n; M = m; } public int MyCulc() { return n + m; } } "@
これで準備完了です。
Powershell内でC#クラスの利用
まず、インスタンスを取得するには以下のように書きます。
ArgumentListでArray形式で引数を渡すのですが、これがコンストラクタの引数になります。
$mycls = New-Object MyClass -ArgumentList (3,6)
しっかりコンストラクタの設定がインスタンス変数に反映されてます。
PS> $mycls M n - - 6 3
Get-Memberでメンバーを確認してみましょう。
通常のフィールドとして宣言した変数のnもPropertyタイプとなってます。
PS> Get-Member -InputObject $mycls TypeName: MyClass Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() MyCulc Method int MyCulc() ToString Method string ToString() M Property int M {get;set;} n Property int n {get;set;}
最後に残りの機能も確認してみます。
//プロパティも機能してます(Mに5以下の数字を設定した場合は5になる) PS > $mycls.n = 10 PS > $mycls.M = 3 PS > $mycls M n - - 5 10 //もちろんメソッドも通常通り使えます PS > $mycls.MyCulc() 15
問題無く動いてそうです。