如何在PowerShell中向类内置的.net类添加类方法?

时间:2013-08-01 12:53:04

标签: .net class powershell

我知道我可以像这样在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的机器上运行时,我遇到了错误。我不想修改使用该方法的所有地方,而是只想添加该方法(如果它不存在)。 感谢。

2 个答案:

答案 0 :(得分:4)

文档说

  

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

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

答案 1 :(得分:0)

我认为您不会将成员添加到类中,只会添加到类的实例中。我将创建自己的函数Test-StringIsNullOrWhiteSpace,它在.NET 4.0 / 4.5下运行时使用内置的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