Можно ли ссылаться на другое свойство в конструкторе? - PullRequest
0 голосов
/ 05 января 2019

Фон

Все началось с командлета в качестве ответа для Сохранить хэш-таблицу в нотации объектов PowerShell (PSON) . Между тем эволюционировал до ConvertTo-Expression . Командлет, который сериализует объекты PowerShell в выражение PowerShell.
Будучи немного вовлеченным в -Depth проблемы с похожими нативными командлетами ( ConvertTo-Xml и ConvertTo-Json ) из-за повторяющихся ссылок на свойства, мне интересно, если эта проблема может быть приятно разрешается в выражении 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

Но такой вывод очень запутал бы результат для читабельности.

Вопрос

Существуют ли другие способы (например, использование $This, ScriptProperty или ...) для восстановления ссылочного свойства в PowerShell объекте?
Можно ли ссылаться на другое свойство во время строительства?
(Я понимаю, что сам объект не завершен, но родительская ссылка, вероятно, уже существует. Кроме того, я мог бы представить, что ссылка еще не существует, выполнив что-то вроде ленивая инициализация .)

...