Powershell内で書いたC#で書いたクラスを使う(コンストラクターやプロパティの利用)

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

問題無く動いてそうです。