我最近开始使用powershell 5创建类。当我关注这个很棒的指南https://xainey.github.io/2016/powershell-classes-and-concepts/#methods
我想知道是否可以覆盖get_x
和set_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;}
我想这样做,因为我认为除了使用我的自定义Get
和Set
方法之外,其他人访问这些属性会更容易:
Class Foobar {
hidden [string]$Prop1
[string] GetProp1() {
return $this.Prop1
}
[void] SetProp1([String]$Prop1) {
$this.Prop1 = $Prop1
}
}
答案 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”。