Powershell类实现get set属性

Aug*_*ler 5 powershell properties class

如何使用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
Run Code Online (Sandbox Code Playgroud)

alx*_*x9r 7

你可以Add-Member ScriptProperty用来实现一种getter和setter:

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

新建它会调用初始化程序,$_p为其添加scriptproperty p:

PS C:\> $c = [c]::new()
Run Code Online (Sandbox Code Playgroud)

使用属性p产生以下结果:

PS C:\>$c.p = 'arg value'
PS C:\>$c.p
getter setter arg value
Run Code Online (Sandbox Code Playgroud)

这种技术存在一些缺陷,这些缺陷主要与Add-Member线路的冗长和容易出错有关.为了避免这些陷阱,我实施Accessor了你可以在这里找到的.

使用Accessor而不是进行Add-Member大量的错误检查并将原始类实现简化为:

class c {
    hidden $_p = $(Accessor $this {
        get {
            "getter $($this._p)"
        }
        set {
            param ( $arg )
            $this._p = "setter $arg"
        }
    })
}
Run Code Online (Sandbox Code Playgroud)