我正在尝试使用Add-Member向Powershell变量添加元素。 使用NoteProperty添加静态属性和使用ScriptMethod添加方法没有问题:
$variable = New-Object PSObject
$variable | Add-Member NoteProperty Key "Value"
$variable | Add-Member ScriptMethod DoSomething { // code }
现在我坚持这个:
我想添加一个具有getter和setter的属性,并通过代码块执行一系列操作。
VBScript等价物是这样的:
Class MyClass
Public Property Get Item(name)
// Code to return the value of Item "name"
End Property
Public Property Let Item(name,value)
// Code to set the value of Item "name" to value "value"
End Property
End Class
请注意,我需要编写的代码部分不仅仅是设置/获取值,它们比这更复杂(设置其他相关变量,访问外部数据等等)。
我在PowerShell中找不到任何这么简单的东西,最后添加了2个脚本方法,GetItem和SetItem。
在PowerShell中的PSObject成员中实现此get / let functionnality的最佳方法是什么?
提前致谢
答案 0 :(得分:2)
您应该添加-MemberType ScriptProperty
并使用-Value
和-SecondValue
:
# Make an object with the script property MyProperty
$variable = New-Object PSObject
# “internal” value holder
$variable | Add-Member -MemberType NoteProperty _MyProperty -Value 42
# get/set methods
$get = {
Write-Host "Getting..."
$this._MyProperty
}
$set = {
Write-Host "Setting..."
$this._MyProperty = $args[0]
}
# the script property
$variable | Add-Member -MemberType ScriptProperty MyProperty -Value $get -SecondValue $set
测试:
Write-Host "Original value: $($variable.MyProperty)"
$variable.MyProperty = 123
Write-Host "After assignment: $($variable.MyProperty)"
打印:
Getting...
Original value: 42
Setting...
Getting...
After assignment: 123
不幸的是,我不知道如何制作“受保护/私有”的内部价值持有者,例如我们示例中的注释属性_MyProperty
(或者是否可能)。
更新:显然这是标题所要求的答案。但问题实际上是参数化属性,而不仅仅是通过脚本块实现的get / set方法。我尝试将此类属性(ParameterizedProperty
)与Add-Member
一起使用失败,可能尚未支持。