VBScript Public Property Set/Get Equivalent в PowerShell
-
10-10-2019 - |
Вопрос
Я пытаюсь добавить элементы к переменной PowerShell с добавлением. У меня нет проблем с добавлением статических свойств с заметками и методами с 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 ScriptMethods, GetiTem и SetItem.
Как бы лучший способ реализовать эту функцию GET/LET у члена PSObject в PowerShell?
заранее спасибо
Решение
Вы должны добавить -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
К сожалению, я не знаю, как сделать «защищенные/частные» владельцы внутренних значений, такие как свойство Note _MyProperty
В нашем примере (или это возможно вообще).
ОБНОВИТЬ: Видимо, это ответ на то, что более или менее просит заголовок. Но на самом деле вопрос о параметризованном свойстве, а не просто методах получения/установки, реализованных с помощью сценариев. Моя попытка использовать этот тип собственности (ParameterizedProperty
) с Add-Member
потерпел неудачу, возможно, это еще не поддерживается.