首页 > 解决方案 > 是否可以在构造函数中引用另一个属性?

问题描述

背景

它以 cmdlet 作为Save hash table in PowerShell object notation (PSON)的答案开始。同时演变为ConvertTo-Expression。将 PowerShell 对象序列化为 PowerShell 表达式的 cmdlet。
由于重复的属性引用,有点涉及-Depth类似本机 cmdlet(ConvertTo-XmlConvertTo-Json)的问题,我想知道这个问题是否可以在 PowerShell 表达式中很好地解决。

例子

$Object = @{
    Name = "Parent"
    Child = @{
        Name = "Child"
    }
}
$Object.Child.Parent = $Object

在此示例中,该.Child.Parent属性引用 back $Object,表示$Object.Child.Parent.Child.Parent.Name返回Parent
目前,$Object | ConvertTo-Expression返回ScriptBlock类似:

 @{
        'Child' = @{
                'Parent' = $_
                'Name' = 'Parent'
        }
        'Name' = 'Parent'
}

要重建(重复出现的)属性引用,我可能会返回如下表达式:

[ScriptBlock]::Create(
@'
$_ = @{
        'Child' = @{
                'Parent' = $_
                'Name' = 'Parent'
        }
        'Name' = 'Parent'
}
$_.Child.Parent = $_
$_
'@
)

(类似于示例中最初构造对象的方式。)
Restoreing (invoking, deserializing) 这个表达式采用如下内容:

$Expression = [ScriptBlock]::Create(... # The above result
$Object = &$Expression
$Object.Child.Parent.Name

但是这样的输出会极大地混淆结果的可读性。

问题

是否有任何其他方法(例如使用$This、aScriptProperty或...)来恢复PowerShell对象中的引用属性?
是否可以在施工时引用另一个属性?(我知道对象本身并不完整,但父引用可能已经存在。此外,我可以通过像延迟初始化
这样的操作来想象引用不需要存在。)

标签: powershellpropertiesreferencerecurring

解决方案


推荐阅读