可以在构造函数中引用另一个属性吗?

时间:2019-01-05 20:58:25

标签: powershell properties reference recurring

背景

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

示例

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

在此示例中,.Child.Parent属性返回到$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 = $_
$_
'@
)

(类似于示例中对象的初始构造。)
恢复(调用,反序列化)此表达式的过程类似:

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

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

问题

是否还有其他方法(例如使用$ThisScriptProperty或...)来还原 PowerShell 对象中的引用属性?
在施工时是否可以引用其他属性?
 (我知道对象本身并不完整,但是父引用可能已经存在。此外,我可以通过执行类似lazy initialization的操作来想象该引用还不需要存在。)

0 个答案:

没有答案