Определение нового или переопределение существующего пользовательского метода System Object - PullRequest
0 голосов
/ 13 октября 2018

Друзья, как я могу определить новые пользовательские методы System Object или переопределить существующие?

# Example of using Add-Member cmdlet:
Add-Member -InputObject [System.Array] -MemberType "ScriptMethod" -Name "joinSpaces" -Value {return $This -join " "}

# Check the method added:
[System.Array]::joinSpaces -eq $Null  #=> True
[System.Array].joinSpaces -eq $Null  #=> True
("a", "b").joinSpaces -eq $Null  #=> True

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Чтобы определить новых членов на уровне тип , а не на уровне экземпляр , необходимо использовать Update-TypeData вместо Add-Member:

Update-TypeData -TypeName System.Array -MemberType ScriptMethod -MemberName JoinSpaces `
  -Value { $this -join ' ' }

Для принудительного переопределения , добавьте -Force.

Это делает метод доступным для всех будущих экземпляров типа [System.Array].

Чтобы увидеть его в действии:

PS> ('one', 'two').JoinSpaces()
one two

Что касается то, что вы пытались :

Передав [System.Array] в -InputObject, вы передали строковый литерал '[System.Array]', а не массив type , потому что в аргумент -разбор режиматокен, начинающийся с [, интерпретируется как строка , а не как выражение.

Чтобы передать тип , вам пришлось бы использовать -InputObject ([System.Array])- обратите внимание на (...) - но при этом метод joinSpaces() будет присоединен к объекту , представляющему сам тип , а не всех экземпляров этого типа.

Другими словами, вы бы смоглисделайте следующее, хотя это не очень полезно:

PS> [System.Array].joinSpaces()
System.Array
0 голосов
/ 13 октября 2018

Вот пример:

[PSCustomObject]$PSCustomObject = @{Name='MyPSCustomObject';DataSet=@()}

Add-Member -InputObject $PSCustomObject -MemberType 'ScriptMethod' -Name 'JoinSpaces' -Value {return $This.DataSet -join ' '} -PassThru

$PSCustomObject.DataSet = 'a','b','c','d','e'

$PSCustomObject.JoinSpaces()

Вывод:

a b c d e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...