引用PowerShell类中另一个属性的属性

时间:2017-04-13 14:29:23

标签: class powershell object

是否可以在类引用另一个属性?例如,像这样的东西。我尝试了几种方法,现在我不确定我是否可以这样做......:

class TestClass {

    [string]
    $SQLInstanceName

    [string]
    $Server = "$($env:COMPUTERNAME)\$SQLInstanceName"

    [string]myResult()
    {
        return $this.Server
    }
}

....谢谢

2 个答案:

答案 0 :(得分:2)

如果要在同一对象中引用非静态属性/方法,就应该使用$this,就像使用myResult()方法一样。此外,您当前的示例没有默认值或构造函数,因此SQLInstanceName为空,因此只需添加$this而不设置变量,可能会给您带来误导性结果。以下示例可能需要考虑,但存在缺陷。

class TestClass {

    [string]$SQLInstanceName = "Test"

    [string]$Server = "$($env:COMPUTERNAME)\$($this.SQLInstanceName)"

    [string]myResult()
    {
        return $this.Server
    }
}

$tcobject = New-Object TestClass
$tcobject.myResult()

但是,如果更改 SQLInstanceName属性,则此操作无效,因为您只是设置默认值。 v5中的类实际上并没有像.Net类那样真正实现get和set,所以你必须按照this answer中的讨论,而不是this blog中讨论的那样推出自己的解决方案。 v5课程一般。

所以简单的解决方案会像这样工作,以获得我想要的东西。

class TestClass {

    [string]
    $SQLInstanceName = "Test"

    [string]
    $Server = $env:COMPUTERNAME

    [string]myResult()
    {
        return "$($this.Server)\$($this.SQLInstanceName)"
    }
}

$tcobject = New-Object TestClass
$tcobject.SQLInstanceName = "server\prod"
$tcobject.myResult()

这将是一个设计选择,但我不会尝试根据另一个的值在这种情况下动态更改一个属性。由于您使用它们的值组合,一个简单的方法可以工作。

答案 1 :(得分:1)

是。在这里,它在您的类定义中实现:

class TestClass {

    [string]
    $SQLInstanceName

    hidden $_Server = $($this | Add-Member ScriptProperty 'Server' `
        {
            # get
            "$($env:COMPUTERNAME)\$($this.SQLInstanceName)"
        }
    )

    [string]myResult()
    {
        return $this.Server
    }
}

要查看此工作,请新建一个实例并为SQLInstanceName指定一个值。

$c = [TestClass]::new()
$c.SQLInstanceName = 'MyDB'

然后调用

$c.Server
$c.myResult()

结果

ComputerName\MyDB
ComputerName\MyDB