Class 引用PowerShell类中其他属性的属性

Class 引用PowerShell类中其他属性的属性,class,powershell,object,Class,Powershell,Object,一个类中有一个属性可以引用另一个吗?例如,类似这样的事情。我已经尝试了一些方法,现在我不确定我是否能做到这一点…: class TestClass { [string] $SQLInstanceName [string] $Server = "$($env:COMPUTERNAME)\$SQLInstanceName" [string]myResult() { return $this.Server } } …谢谢如

一个类中有一个属性可以引用另一个吗?例如,类似这样的事情。我已经尝试了一些方法,现在我不确定我是否能做到这一点…:

class TestClass {

    [string]
    $SQLInstanceName

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

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

…谢谢

如果您希望引用同一对象中的非静态属性/方法,就像您使用
myResult()
方法一样,您应该使用
$this
。此外,当前示例没有默认值或构造函数,因此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,因此您必须为此推出自己的解决方案,正如中所讨论的,但通常也在关于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()

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

如果希望引用同一对象中的非静态属性/方法,就像使用
myResult()
方法一样,应该使用
$this
。此外,当前示例没有默认值或构造函数,因此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,因此您必须为此推出自己的解决方案,正如中所讨论的,但通常也在关于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()

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

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

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

对。在这里,它在类定义中实现:

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

谢谢这向我展示了一些新东西,并动态地更改了服务器。谢谢。这向我展示了一些新东西,并动态地更改了服务器。谢谢Matt。特别是解释和博客链接。看起来不错。干杯,谢谢,马特。特别是解释和博客链接。看起来不错。干杯