gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:14:39 25 4
gpt4 key购买 nike

假设我有一个像这样的 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

是否可以附加一个事件,以便在值属性更改时执行 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

最佳答案

这不是将 value 设为 NoteProperty 使其成为 ScriptProperty,而是定义单独调用的 get 和 set 方法,而不是直接修改一个字段。

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

(Value 定义获取方法,SecondValue 定义集合。)

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

第二期

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

关于events - 是否可以将事件附加到 PSObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18865680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com