2

我知道我可以像这样在 PowerShell 中的内置 .net 类中添加一个实例方法。

PS C:\Users\a> [string] | Add-Member -MemberType ScriptMethod -Name test -Value {
>> param(
>>     $name
>> )
>> Write-Host $name
>> }
>>
PS C:\Users\a> [string].test("Joe")
Joe
PS C:\Users\a>

我想知道是否可以添加一个我可以调用它的类方法[string]::test("blah")

谢谢。


编辑:

我想这样做的原因是因为我已经针对 .net 4.5 编写了一个 PowerShell 脚本,并且我使用[string]::isnullorwhitespace了 .net 4 和 .net 4.5 方法。当我在仅安装了 .net 3.0 的机器上运行时,出现错误。我不想修改所有使用该方法的地方,如果它不存在,我只想添加该方法。谢谢。

4

2 回答 2

4

文档说

Add-Member cmdlet 允许您将成员(属性和方法)添加到 Windows PowerShell 对象的实例

所以我担心以这种方式添加静态成员是不可能的。

于 2013-08-01T13:01:53.063 回答
0

我认为您不会将成员添加到类中,而只会添加到类的实例中。我会创建你自己的函数,它在 .NET 4.0/4.5 下运行时Test-StringIsNullOrWhiteSpace使用内置IsNullOrWhiteSpace方法,但在以前的 .NET 版本下你自己的实现:

filter Test-StringIsNullOrWhiteSpace
{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string]
        # The string to test.
        $InputObject
    )

    if( [string].GetMethods() | Where-Object { $_.Name -eq 'IsNullOrWhiteSpace' } )
    {
        return [string]::IsNullOrWhitespace( $InputObject )
    }

    return ($InputObject -eq $null -or $InputObject -match '^\s*$')
}

您应该可以像这样使用它:

if( Test-StringIsNullOrWhiteSpace $var )
{
    Write-Host ('$var is null or only whitespace.')
}

$emptyVars = $vars | Test-StringIsNullOrWhiteSpace
于 2013-08-01T18:26:19.800 回答