gpt4 book ai didi

powershell - 可选的静态类方法以实现接口(interface)兼容性

转载 作者:行者123 更新时间:2023-12-05 03:30:20 25 4
gpt4 key购买 nike

我定义了一个自定义的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com