C# 二进制 PowerShell 模块中的 ValidateScript ParameterAttribute

tom*_*ulk 2 c# binary powershell powershell-module

我最近开始在 C# 中尝试二进制 PowerShell 编程,但我在 ParameterValidationAttributes(主要是 ValidateScript 属性)方面遇到了一些问题。基本上,我想创建一个名为“ComputerName”的参数并验证当时计算机是否在线。在 PowerShell 中很容易:

    [Parameter(ValueFromPipeLine = $true)]
    [ValidateScript({ if (Test-Connection -ComputerName $_ -Quiet -Count 1) { $true } else { throw "Unable to connect to $_." }})]
    [String]
    $ComputerName = $env:COMPUTERNAME,
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在 C# 中复制它。ValidateScript 属性采用 ScriptBlock 对象http://msdn.microsoft.com/en-us/library/system.management.automation.scriptblock(v=vs.85).aspx我只是不确定如何在 C# 中创建它,我真的找不到任何例子。

[Parameter(ValueFromPipeline = true)]
[ValidateScript(//Code Here//)]
public string ComputerName { get; set; }
Run Code Online (Sandbox Code Playgroud)

C# 对我来说很陌生,所以如果这是一个愚蠢的问题,我深表歉意。这是 ValidateScript 属性类的链接:http : //msdn.microsoft.com/en-us/library/system.management.automation.validatescriptattribute(v=vs.85).aspx

use*_*407 6

这在 C# 中是不可能的,因为 .NET 只允许typeof属性参数的编译时常量、表达式和数组创建表达式,并且只有常量可用于引用类型,而string不是null. 相反,您应该从派生ValidateArgumentsAttribute并覆盖Validate以执行验证:

class ValidateCustomAttribute:ValidateArgumentsAttribute {
    protected override void Validate(object arguments,EngineIntrinsics engineIntrinsics) {
        //Custom validation code
    }
}
Run Code Online (Sandbox Code Playgroud)