2010-11-15 82 views
3

我试图添加元素到添加成员的Powershell变量。 我没有问题,添加具有NoteProperty静态属性,并与ScriptMethod方法,像:VBscript公共属性设置/在PowerShell中获取等效项

$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。

在PowerShell的PSObject成员中实现get/let函数的最佳方式是什么?

在此先感谢

+1

您可以使用'Add-Member'来添加一个'ParametrizedProperty',但我找不到这样做的例子。文档在这方面有点缺乏。 – Joey 2010-11-15 14:44:29

+0

是的,参数化属性似乎是我想要的,但它保留用于其他用途,因为我所做的每个测试都产生了相同的错误消息,指出添加成员无法添加ParameterizedProperty类型的成员。错误消息指出我应该选择另一个MemberTyper。 – Baramin 2010-11-15 15:40:06

+1

参数化属性不适合最终用户使用 - 主要针对COM适配器。 – x0n 2010-11-17 00:55:17

回答

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(或者它是否可能)。

UPDATE:显然它是标题要求的答案。但问题实际上是关于参数化属性,而不仅仅是通过脚本块实现get/set方法。我尝试使用这种类型的属性(ParameterizedProperty)与Add-Member失败,可能尚未支持。

+1

谢谢,罗马。不幸的是,这不允许这种类型的访问:$ variable.MyProperty(“property1”)=“value1”这就是我所追求的。 – Baramin 2010-11-15 15:47:29

+0

看起来我回答了另一个问题。然后@Joey是对的,这听起来像你应该使用'ParametrizedProperty'类型。 – 2010-11-15 15:52:39

+1

而且它看起来像'ParametrizedProperty'不受支持。如果我尝试然后PS说:“添加成员:不能添加类型为”ParameterizedProperty“的成员。为MemberTypes参数指定一个不同的类型。“因此,也许你的'GetItem' /'SetItem'脚本方法是一种方法。 – 2010-11-15 16:01:20