Events 是否可以将事件附加到PSObject?
假设我有这样一个psobject:Events 是否可以将事件附加到PSObject?,events,powershell,powershell-3.0,psobject,Events,Powershell,Powershell 3.0,Psobject,假设我有这样一个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 是否可以附加事件,以便在值属性
$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
是否可以附加事件,以便在值属性更改时执行方法Sqrt()?即:
PS>$o.value=9
将产生
the square root of 9 is 3
使现代化
根据@Richard answer,这是工作配方:
$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
与其将
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
(作为写入输出的别名)不会做任何有用的事情。将其替换为写入主机
可以正常工作。通常,属性get或set(包括输出)中的副作用是不好的做法(使用它们时预期开销较低)。而不是将值设置为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
(作为写入输出的别名)不会做任何有用的事情。将其替换为写入主机
可以正常工作。一般来说,属性get或set(包括输出)中的副作用是不好的做法(使用它们时预期开销较低)。您已经从自身角度定义了val
。基础字段必须是不同的名称(请注意我使用的\ucode>前缀)。谢谢。但是,现在修改了基础字段,但没有执行该方法。我已经更新了我的帖子。你的意思是这是一种不好的做法吗?@Kayasax:使用属性产生副作用:是的。(然而,我会说“差”而不是“差”:还有更糟糕的做法:-(.)好的。但是在这种情况下,它是故意的(我在考虑javascript中的onChange或onSubmit事件),您已经定义了val
。基础字段必须是不同的名称(注意我使用的。
前缀)。谢谢。但是,现在基础字段被修改了,但方法没有被执行。我已经更新了我的帖子。你的意思是这是一种不好的做法吗?@Kayasax:使用属性处理副作用:是的。(但是我会说“差”而不是“差”:有更糟糕的做法:-()好的。但在本例中,它是有意创建的(我在考虑javascript中的onChange或onSubmit事件)