随着5.0版以来PowerShell类的引入,我想知道是否可以创建只读属性以及如何创建它.属性值从内部逻辑填充,用户可以读取但不设置它.
考虑以下代码来创建一个类,假设我想将属性"Year"设置为只读:
class Car {
[string] $Maker;
[string] $Model;
[string] $Year;
[int] $Odometer ;
[void] Drive([int] $NbOfKM) {
$this.Odometer += $NbOfKM;
}
Car(){
}
Car([int] $Odometer){
$this.$Odometer = $Odometer;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,PowerShell中没有getter/setter支持.
你可以做的是使用hidden关键字隐藏属性,只提供获取值的方法,但只在内部设置.然后"设定者"变得不易被发现.
我没有足够的声誉来评论斯图尔特的答案。然而,这是建立在他的答案的基础上的,因为解决方法是重写 setter 方法。
我发现您可以使用 ScriptProperty 以一种不优雅的方式实现 getter 和 setter。两个相关帖子: Powershell 类实现 get set property, https://powershell.org/forums/topic/class-in-powershell-5-that-run-custom-code-when-you-set-property/。我更喜欢第二种,因为它将动态代码放入构造函数中。我的代码的一个例子:
class MyClass {
MyClass () {
$this.PSObject.Properties.Add(
(New-Object PSScriptProperty 'ReadOnlyProperty', {$this._ROF})
)
}
hidden [string]$_ROF = 'Readonly'
}
Run Code Online (Sandbox Code Playgroud)
PSScriptProperty 的构造函数采用一个名称,然后是一两个脚本块;第一个是 getter,第二个(如果提供)是 setter。https://msdn.microsoft.com/en-us/library/system.management.automation.psscriptproperty(v=vs.85).aspx
这种方法的缺点: