Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 是否可以将事件附加到PSObject?_Events_Powershell_Powershell 3.0_Psobject - Fatal编程技术网

Events 是否可以将事件附加到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 是否可以附加事件,以便在值属性

假设我有这样一个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 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事件)