是否可以在类引用另一个属性?例如,像这样的东西。我尝试了几种方法,现在我不确定我是否可以这样做......:
class TestClass {
[string]
$SQLInstanceName
[string]
$Server = "$($env:COMPUTERNAME)\$SQLInstanceName"
[string]myResult()
{
return $this.Server
}
}
....谢谢
答案 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