2

假设我有一个这样的 psobject:

$o=New-Object PSObject -Property @{"value"=0}
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value {
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))"
} -inputObject $o

是否可以附加一个事件,以便在 value 属性更改时执行方法 Sqrt() ?IE :

PS>$o.value=9

会产生

the square root of 9 is 3

更新

根据@Richard 的回答,这是有效的配方:

$o=New-Object PSObject -property @{"_val"=1}
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value {
    write-host "the square root of $($this._val) is $([Math]::Round([Math]::Sqrt($this._val),2))"
} -inputObject $o


Add-Member -MemberType ScriptProperty -Name 'val' -Value{ $this._val }  -SecondValue { $this._val=$args[0];$this.Sqrt() } -inputObject $o
4

1 回答 1

4

这不是将value其设为NotePropertymake 它ScriptProperty,而是包括定义单独的 get 和 set 方法,这些方法被调用而不是直接修改字段。

$theObject | Add-Member -MemberType ScriptProperty -Name 'Value' 
                        -Value{ $this._value }
                        -SecondValue { $this._value = $args[0]; $this.Sqrt }

Value定义了get方法,SecondValueset。)

请注意,由于 PowerShell 不提供任何封装数据的功能,调用者仍然可以访问底层字段。用 C#(或其他 .NET 语言)编写自定义类型并使用Add-Type它可以避免这种情况,但不太可能值得,除非您确实有不遵守规则的调用者。

第二期

在 ScriptProperty 中没有输出管道(任何输出都被丢弃),因此echo(作为 的别名Write-Output)不会做任何有用的事情。Write-Host用作品代替它。一般来说,属性获取或设置(包括输出)中的副作用是不好的做法(使用它们时期望低开销)。

于 2013-09-18T08:10:10.007 回答