是否可以覆盖PowerShell 5类中的Getter / Setter函数?

时间:2016-12-05 15:17:47

标签: powershell

我最近开始使用powershell 5创建类。当我关注这个很棒的指南https://xainey.github.io/2016/powershell-classes-and-concepts/#methods

我想知道是否可以覆盖get_xset_x方法。

示例:

Class Foobar2 {
    [string]$Prop1    
}

$foo = [Foobar2]::new()
$foo | gm



Name        MemberType Definition                    
----        ---------- ----------                    
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()             
GetType     Method     type GetType()                
ToString    Method     string ToString()             
Prop1       Property   string Prop1 {get;set;}  

我想这样做,因为我认为除了使用我的自定义GetSet方法之外,其他人访问这些属性会更容易:

Class Foobar {
    hidden [string]$Prop1

    [string] GetProp1() {
        return $this.Prop1
    }

    [void] SetProp1([String]$Prop1) {
        $this.Prop1 = $Prop1
    }
}

2 个答案:

答案 0 :(得分:11)

不幸的是,新的Classes功能没有getter / setter属性的功能,就像你从C#中知道它们一样。

但是,您可以将ScriptProperty成员添加到现有实例,该实例将表现出与C#中的属性类似的行为:

Class FooBar
{
    hidden [string]$_prop1
}

$FooBarInstance = [FooBar]::new()
$FooBarInstance |Add-Member -Name Prop1 -MemberType ScriptProperty -Value {
    # This is the getter
    return $this._prop1
} -SecondValue {
    param($value)
    # This is the setter
    $this._prop1 = $value
}

现在,您可以通过对象上的$_prop1属性访问Prop1

$FooBarInstance.Prop1
$FooBarInstance.Prop1 = "New Prop1 value"

答案 1 :(得分:4)

只是扩大Mathias的答案...

您可以将“ add-member”部分包括在该类的构造函数中,以便只需实例化该类即可自动添加它。

以Mathias的答案为例:

Class FooBar
{
    hidden [string]$_prop1

    FooBar(){
        $this | Add-Member -Name Prop1 -MemberType ScriptProperty -Value {
            # This is the getter
            return $this._prop1
        } -SecondValue {
            param($value)
            # This is the setter
            If ($value -eq 'foo'){$value = 'bar'}
            $this._prop1 = $value
        }
    }
}

创建与该类同名的类方法将覆盖该类的“构造函数”。每当您创建新的“ foobar”对象时,该方法中的代码部分都将运行。在这里,我们结合了Add-Member cmdlet,仅通过创建对象即可为我们添加脚本属性。

$FooBarInstance = [FooBar]::new()

$FooBarInstance.Prop1 = 'Egon Spenglar'
Write-host $FooBarInstance.Prop1 -ForegroundColor Green

如果将任何内容传递给它(如本例中的分配),它将更改_Prop1属性,使其等于传递给它的任何内容。 (在这种情况下为“ Egon Spenglar”)。 _Prop1是“隐藏”属性,因此您通常不会在对象上看到它,我们只是使用它来添加此脚本属性来存储和检索信息。

然后,如果您不带任何参数调用Prop1属性,它将仅返回_Prop1中的值。

$FooBarInstance.Prop1 = 'foo'
Write-host $FooBarInstance.Prop1 -ForegroundColor Green

作为一个示例,说明为什么您可能想要执行类似的操作,在“ Add-Member” cmdlet中添加了一些逻辑,以检查是否传递了字符串“ foo”,以及是否因此,它将存储“ bar”。

第二个示例将返回“ bar”。