2016-09-27 3 views
2

Powershellクラスでget/setプロパティを実装する方法を教えてください。 下の私の例で見てください。Powershellクラス実装のget setプロパティ

Class TestObject 
{ 
    [DateTime]$StartTimestamp = (Get-Date) 
    [DateTime]$EndTimestamp = (Get-Date).AddHours(2) 

    [TimeSpan] $TotalDuration { 
    get { 
     return ($this.EndTimestamp - $this.StartTimestamp) 
    } 
    } 

    hidden [string] $_name = 'Andreas' 
    [string] $Name { 
    get { 
     return $this._name 
    } 
    set { 
     $this._name = $value 
    } 
    } 
} 

New-Object TestObject 
+1

PowerShellは、フィールドおよびプロパティを区別することはできません。 –

+0

したがって、関数を使用せずに開始時間と終了時間を使用して継続時間を自動的に計算することはできませんか? –

+0

私が知る限り、そうではありません。 –

答えて

3

あなたがゲッターとセッターの種類を達成するためにAdd-Member ScriptPropertyを使用することができます。

class c { 
    hidden $_p = $($this | Add-Member ScriptProperty 'p' ` 
     { 
      # get 
      "getter $($this._p)" 
     }` 
     { 
      # set 
      param ($arg) 
      $this._p = "setter $arg" 
     } 
    ) 
} 

NEWINGそれをscriptproperty pを追加$_pの初期化子を呼び出します。

PS C:\> $c = [c]::new() 

プロパティpを使用すると、次のようになります。

PS C:\>$c.p = 'arg value' 
PS C:\>$c.p 
getter setter arg value 

この技術は、主にAdd-Memberラインがどのように詳細なエラーが発生しがちに関連するいくつかの落とし穴があります。これらの落とし穴を避けるために、私はAccessorを実装しました。あなたはhereです。 Accessor代わりにAdd-Memberを使用

は、エラーチェックの量を行い、これに元のクラスの実装を簡素化:

class c { 
    hidden $_p = $(Accessor $this { 
     get { 
      "getter $($this._p)" 
     } 
     set { 
      param ($arg) 
      $this._p = "setter $arg" 
     } 
    }) 
} 
関連する問題