将方法设置为Powershell中对象的属性
我有一个像这样的对象数组将方法设置为Powershell中对象的属性,powershell,Powershell,我有一个像这样的对象数组 $all = @( @{ Name = 'First'; Method = { FirstMethod 1 }; Description = "First Description"; } @{ Name = 'Second'; Description = "Second Description" } @{ Name = 'Third'; Method = { ThirdMethod }; Description = "Third Descrip
$all = @(
@{ Name = 'First'; Method = { FirstMethod 1 }; Description = "First Description"; }
@{ Name = 'Second'; Description = "Second Description" }
@{ Name = 'Third'; Method = { ThirdMethod }; Description = "Third Description" }
)
每个对象都有一个名称(字符串)、一个描述(字符串)和一个方法(包含函数及其可选项)
而FirstMethod
和SecondMethod
如下所示:
Function FirstMethod
{
param($number)
Write-Host "$number - some other things"
return $number
}
Function ThirdMethod
{
Write-Host "Second called"
return 'test'
}
$obj1 = [PSCustomObject]@{
Name = 'First'
Description = 'First Description'
}
$obj1 | Add-Member -Name 'Method' -Type ScriptMethod -Value {FirstMethod 1}
$obj2 = [PSCustomObject]@{
Name = 'Second'
Description = 'Second Description'
}
$obj3 = [PSCustomObject]@{
Name = 'Third'
Description = 'Third Description'
}
$obj3 | Add-Member -Name 'Method' -Type ScriptMethod -Value {ThirdMethod}
$all = $obj1, $obj2, $obj3
我正在遍历$all
中的所有项目,并尝试调用方法
参数(如果存在):
Function RunAll
{
foreach($item in $all)
{
If($item.Method)
{
Write-Host "It has method and its running it"
$returned_from_method = $item.Method
Write-Host "Value returned from method: $returned_from_method"
}
Else
{
Write-Host "Does not have a method!"
}
}
}
所以基本上我在这里需要的是:当循环在数组的第一个项$returned\u from\u method=$item.method
中时,它应该返回1
(因为它调用FirstMethod
并通过1。当循环在数组的第三个项中时,它应该返回test
(因为它调用了ThirdMethod
)
我能做到这一点吗?如果有人在为这一点而挣扎,下面是答案:
方法FirstMethod
和ThirdMethod
应该在数组之前声明
然后我需要在()
中添加函数,而不是{}
Function FirstMethod
{
param($number)
Write-Host "$number - some other things"
return $number
}
Function ThirdMethod
{
Write-Host "Second called"
return 'test'
}
$all = @(
@{ Name = 'First'; Method = ( FirstMethod 1 ); Description = "First Description"; }
@{ Name = 'Second'; Description = "Second Description" }
@{ Name = 'Third'; Method = ( ThirdMethod ); Description = "Third Description" }
)
现在它工作正常了!您发布的代码既不定义(自定义)对象也不定义方法。它定义了一个哈希表列表,其中一个键具有scriptblock值。对该键使用点访问将只返回scriptblock的定义,而不调用它
演示:
PS C:\> $ht = @{Name='foo'; Method={FirstMethod 1}; Description='bar'}
PS C:\> $ht.Method
FirstMethod 1
scriptblock中调用的函数是在创建哈希表或对象之前还是之后定义并不重要,只要它是在调用scriptblock之前定义的。您自己的答案中的代码似乎只起作用,因为您用分组表达式(括号)替换了scriptblock(花括号)。但是,这意味着“方法”是根据哈希表的定义进行评估的,并且只有函数的返回值与键一起存储。Write Host
输出立即写入控制台,而不是与键一起存储
PS C:\> $ht = @{Name='foo'; Method=(FirstMethod 1); Description='bar'}
1 - some other things
PS C:\> $ht.Method
1
这不是您在PowerShell中定义对象或对象方法的方式。谢谢!是否可以调用$obj1.Method.Invoke()
并将参数传递给它?@ErtanHasani如果您有一个带有实际对象方法的适当对象,它应该是$obj1.Method()
,而不是$obj1.Method.Invoke())
。是的,如果scriptblock被定义为接受参数,则可以传递参数。
PS C:\> $ht = @{Name='foo'; Method=(FirstMethod 1); Description='bar'}
1 - some other things
PS C:\> $ht.Method
1
PS C:\> $obj | Add-Member -Name 'Method2' -Type ScriptMethod -Value {FirstMethod 2}
PS C:\> $obj.Method2()
2 - some other things
2
$obj1 = [PSCustomObject]@{
Name = 'First'
Description = 'First Description'
}
$obj1 | Add-Member -Name 'Method' -Type ScriptMethod -Value {FirstMethod 1}
$obj2 = [PSCustomObject]@{
Name = 'Second'
Description = 'Second Description'
}
$obj3 = [PSCustomObject]@{
Name = 'Third'
Description = 'Third Description'
}
$obj3 | Add-Member -Name 'Method' -Type ScriptMethod -Value {ThirdMethod}
$all = $obj1, $obj2, $obj3