Открытое свойство VBscript Установить / получить эквивалент в PowerShell - PullRequest
3 голосов
/ 15 ноября 2010

Я пытаюсь добавить элементы в переменную Powershell с помощью Add-Member.У меня нет проблем с добавлением статических свойств с помощью 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.

Как лучше всего реализовать эту функциональность get / let в элементе PSObject в PowerShell?

Заранее спасибо

1 Ответ

2 голосов
/ 15 ноября 2010

Вы должны добавить -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 не удалась, возможно, он еще не поддерживается.

...