为何PowerShell数组自身无OutMsg方法却可调用该成员方法?
PowerShell数组调用成员方法的疑问解答
示例代码
class MyClass { } class MyClass1 : MyClass { [void] OutMsg([string] $Str) { Write-Host -Object "MyClass1: $Str" } } class MyClass2 : MyClass { [void] OutMsg([string] $Str) { Write-Host -Object "MyClass2: $Str" } } [MyClass[]] $ClassArray = @([MyClass1]::new(), [MyClass2]::new()) $ClassArray.OutMsg('TestString')
执行输出
MyClass1: TestString MyClass2: TestString
验证操作
执行以下命令会发现数组对象本身并不具备OutMsg方法:
Get-Member -InputObject $ClassArray
疑问解答
这是PowerShell的**成员枚举(Member Enumeration)**特性在起作用。
当你对集合(比如数组)调用某个方法或访问属性时,如果集合自身没有这个成员,PowerShell会自动遍历集合里的每个元素,对每个元素执行该方法调用或属性访问,最终完成你想要的操作。
放到你的场景里:
$ClassArray是[MyClass[]]类型的数组,数组对象本身确实没有OutMsg方法- 但PowerShell检测到这一点后,自动把方法调用“分发”给了数组中的每一个元素
- 数组里的
MyClass1和MyClass2实例都拥有OutMsg方法,所以各自执行了对应的逻辑,就得到了你看到的输出结果
这个特性是为了简化集合操作,不用你手动写循环去遍历元素调用方法。需要注意的是,如果集合里的元素没有这个成员,调用时会直接报错。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

