我已經使用Powershell中的閉包來創建具有靜態和實例方法的類。有一個更好的方法嗎?Powershell類
用靜態「方法」創建和對象。
function person_get_type {
return 'Person'
}
function make_person {
param
(
[parameter(mandatory=$true)][string]$name)
$properties = @{'name'=$name;'get_type'=$null}
$person = New-Object –TypeName PSObject –Prop $properties
$person.get_type = ${function:person_get_type}
return $person
}
$person = make_person -name 'James'
$type = $person.get_type.InvokeReturnAsIs()
Write-Host $type
用實例「method」創建一個對象。
function dog_get_type {
return 'Dog'
}
function dog_make_get_name{
param
(
[Parameter(Mandatory=$true)][System.Management.Automation.PSObject]$self
)
return {return $self.name}.GetNewClosure()
}
function dog_make_set_name{
param
(
[Parameter(Mandatory=$true)][System.Management.Automation.PSObject]$self
)
return {param([parameter(mandatory=$true)][string]$name) $self.name = $name}.GetNewClosure()
}
function make_dog {
param
(
[parameter(mandatory=$true)][string]$name
)
$properties = @{'name'=$name;'get_type'=$null;'get_name'=$null;'set_name'=$null}
$dog = New-Object –TypeName PSObject –Prop $properties
$dog.get_type = ${function:dog_get_type}
$dog.get_name = dog_make_get_name -self $dog
$dog.set_name = dog_make_set_name -self $dog
return $dog
}
$dog = make_dog -name 'Spot'
$name = $dog.get_name.InvokeReturnAsIs()
Write-Host $name
$dog.set_name.Invoke("Paws")
$name = $dog.get_name.InvokeReturnAsIs()
Write-Host $name
$stuff = @($person,$dog)
foreach($thing in $stuff) {
Write-Host $thing.get_type.InvokeReturnAsIs()
}
我已經看到有可能使用這種方法:
$object = New-Module -AsCustomObject -ScriptBlock {...}
但我不認爲這有可能創建一個使用這種方法的實例方法。
您還可以將ScriptMetod成員添加到對象。 – mjolinor
相關:http://stackoverflow.com/questions/18705158/powershell-create-a-class-file-to-hold-custom-objects/ –
來自未來的讀者:從Powershell 5.0開始,類是一流的部分的語言。沒有更多的需要。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes?view=powershell-5.1 – TurtleZero