C# 二进制 PowerShell 模块中的 ValidateScript ParameterAttribute
ValidateScript ParameterAttribute in C# Binary 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,
但我不知道如何在 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; }
C# 对我来说很新,所以如果这是一个愚蠢的问题,我深表歉意。这是一个 link ValidateScript 属性 Class: http://msdn.microsoft.com/en-us/library/system.management.automation.validatescriptattribute(v=vs.85).aspx
这在 C# 中是不可能的,因为 .NET 只允许编译时常量、typeof
表达式和属性参数的数组创建表达式,除 string
之外的引用类型唯一可用的常量是 null
。相反,您应该从 ValidateArgumentsAttribute
派生并覆盖 Validate
以执行验证:
class ValidateCustomAttribute:ValidateArgumentsAttribute {
protected override void Validate(object arguments,EngineIntrinsics engineIntrinsics) {
//Custom validation code
}
}
只是用一个更完整的例子来扩展 user4003407 上面的回答。
从 ValidateArgumentsAttribute 派生一个新的验证器并覆盖 Validate 以执行验证。验证是无效的,所以你真的只是在你选择的情况下抛出异常。
Kevin Marquette 有一个出色的 article 但它在 powershell 中。这是一个 C# 示例:
[Cmdlet(VerbsCommon.Get, "ExampleCommand")]
public class GetSolarLunarName : PSCmdlet
{
[Parameter(Position = 0, ValueFromPipeline = true, Mandatory = true)]
[ValidateDateTime()]
public DateTime UtcDateTime { get; set; }
protected override void ProcessRecord()
{
var ExampleOutput = //Your code
this.WriteObject(ExampleOutput);
base.EndProcessing();
}
}
class ValidateDateTime:ValidateArgumentsAttribute {
protected override void Validate(object arguments,EngineIntrinsics engineIntrinsics) {
var date = (DateTime)arguments;
if( date.Year < 1700 || date.Year > 2082){
throw new ArgumentOutOfRangeException();
}
}
我最近开始尝试使用 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,
但我不知道如何在 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; }
C# 对我来说很新,所以如果这是一个愚蠢的问题,我深表歉意。这是一个 link ValidateScript 属性 Class: http://msdn.microsoft.com/en-us/library/system.management.automation.validatescriptattribute(v=vs.85).aspx
这在 C# 中是不可能的,因为 .NET 只允许编译时常量、typeof
表达式和属性参数的数组创建表达式,除 string
之外的引用类型唯一可用的常量是 null
。相反,您应该从 ValidateArgumentsAttribute
派生并覆盖 Validate
以执行验证:
class ValidateCustomAttribute:ValidateArgumentsAttribute {
protected override void Validate(object arguments,EngineIntrinsics engineIntrinsics) {
//Custom validation code
}
}
只是用一个更完整的例子来扩展 user4003407 上面的回答。
从 ValidateArgumentsAttribute 派生一个新的验证器并覆盖 Validate 以执行验证。验证是无效的,所以你真的只是在你选择的情况下抛出异常。
Kevin Marquette 有一个出色的 article 但它在 powershell 中。这是一个 C# 示例:
[Cmdlet(VerbsCommon.Get, "ExampleCommand")]
public class GetSolarLunarName : PSCmdlet
{
[Parameter(Position = 0, ValueFromPipeline = true, Mandatory = true)]
[ValidateDateTime()]
public DateTime UtcDateTime { get; set; }
protected override void ProcessRecord()
{
var ExampleOutput = //Your code
this.WriteObject(ExampleOutput);
base.EndProcessing();
}
}
class ValidateDateTime:ValidateArgumentsAttribute {
protected override void Validate(object arguments,EngineIntrinsics engineIntrinsics) {
var date = (DateTime)arguments;
if( date.Year < 1700 || date.Year > 2082){
throw new ArgumentOutOfRangeException();
}
}