是否可以将事件附加到PSObject?

时间:2013-09-18 06:54:45

标签: events powershell powershell-v3.0 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()?即:

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

1 个答案:

答案 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替换它有效。一般来说,属性获取或设置(包括输出)中的副作用是不好的做法(使用它们时期望开销较低)。