说我有一个像这样的对象:
$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()?即:
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
答案 0 :(得分:4)
不是让value
成为NoteProperty
使其成为ScriptProperty
,而是包括定义被调用的单独的get和set方法,而不是直接修改字段。
$theObject | Add-Member -MemberType ScriptProperty -Name 'Value'
-Value{ $this._value }
-SecondValue { $this._value = $args[0]; $this.Sqrt }
(Value
定义get方法,SecondValue
集合。)
请注意,由于PowerShell不提供封装数据的任何功能,因此呼叫者仍可访问基础字段。使用C#(或其他.NET语言)编写自定义类型并使用Add-Type
可以避免这种情况,但除非您确实有不遵守规则的呼叫者,否则不太可能值得。
第二期
在ScriptProperty中没有输出管道(任何输出被丢弃),因此echo
(作为Write-Output
的别名)将不会做任何有用的事情。用Write-Host
替换它有效。一般来说,属性获取或设置(包括输出)中的副作用是不好的做法(使用它们时期望开销较低)。