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。特别是解释和博客链接。看起来不错。干杯,谢谢,马特。特别是解释和博客链接。看起来不错。干杯