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

标签 powershell

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

相关文章:

powershell - 导入模块时如何禁用有关未批准动词的警告?

powershell - 显示将要运行的命令

powershell - 如何在 Powershell 中使用 where 子句为多维数组执行 foreach 循环?

powershell - 按修改日期的 Azure 存储增量复制

perl - Powershell主机文件编辑

variables - 将警告保存到 powershell 中的变量

function - PowerShell更改返回对象的类型

windows - 将 Windows cURL 语法转换为等效的 InvokeRestMethod 命令

python - 在尝试通过在 powershell 中执行代码的 python 脚本运行 print ('hello world' 时发现错误

windows - 如何阻止我的脚本循环