我定义了一个自定义的 ValidateSet 参数属性,如下所示:
Class MyValidValuesAttribute : System.Management.Automation.IValidateSetValuesGenerator {
[string[]] GetValidValues() { return [string[]]'MyValidValueA','MyValidValueB' }
}
我想避免为了返回一组有效值而必须实例化类。
我只是调用 [MyValidValuesAttribute]::GetValidValues()
而不是两行代码
$X = [MyValidValuesAttribute]::new()
$Y = $X.GetValidValues()
但该方法不能是静态的,否则该类将不会实现该接口(interface)。
有什么方法可以使方法以相同的方式工作,而不管该类是否以相同的名称实例化?我知道我可以实现 GetValidValues_Static
;想知道是否存在更优雅的解决方案。
最佳答案
作为Santiago Squarzon指出,您通常不需要实例化 IValidateSetValuesGenerator
-实现类您自己:当您在 [ValidateSet()]
中使用此类时,PowerShell 会为您完成属性以装饰函数或脚本的参数声明 block (param(...)
) 中的参数,以便将传递给该参数的参数限制为从指定类的.GetValidValues()
实例方法。
注意:IValidateSetValuesGenerator
接口(interface)需要 PowerShell (Core) v6+;对于同样适用于 Windows PowerShell 的解决方案,请参阅 this blog post圣地亚哥发现的。
如果您确实需要显式实例化此类:
instead of the two-line
您可以使用单行(行)表达式:
[MyValidValuesAttribute]::new().GetValidValues()
I know I could just implement
GetValidValues_Static
; wondering if a more elegant solution exists.
如果您确实需要将调用仪式保持在最低限度,您可以声明一个静态属性,这样您就可以调用[MyValidValuesAttribute]::ValidValues
:
Class MyValidValuesAttribute : System.Management.Automation.IValidateSetValuesGenerator {
static [string[]] $ValidValues = [MyValidValuesAttribute]::new().GetValidValues()
[string[]] GetValidValues() { return [string[]] ('MyValidValueA','MyValidValueB') }
}
警告:由于静态 ValidValues
属性只被初始化一次,上面假设有效值的集合是静态,这可能与 IValidateSetValuesGenerator
接口(interface)的有意动态性质不一致。
- 事实上,动态 特性是接口(interface)将
.GetValidValues()
定义为实例 方法的原因 - 在某些情况下,可能会返回一组不同的有效值; 否则,您可以简单地使用[ValidateSet()]
属性和一个静态值列表,例如[ValidateSet('MyValidValueA', ' MyValidValueB')]
自 v7.2.1 起,PowerShell 不支持 每次调用 时调用的属性 getter - 请参阅 GitHub issue #2219 .
关于powershell - 可选的静态类方法以实现接口(interface)兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70828007/