Как идентифицировать и индексировать ссылки на объекты - PullRequest
0 голосов
/ 06 января 2019

Этот вопрос относится к ранее заданному вопросу: Можно ли ссылаться на другое свойство в конструкторе?

Для моего ConvertTo-Expression я хотел бы отслеживать ссылки на объекты, чтобы я мог проверить, был ли объект свойства уже сериализован. Для этого я создаю хеш-таблицу, которая использует метод объекта .GetHashCode() (не [ValueType] объектов) как Key.
Это работает для некоторых объектов, но не для PSCustomObjects.

В качестве примера я хочу указать, что свойство Parent свойства Child ссылается на тот же $Parent Object:

$Parent = [PSCustomObject]@{
    Name = "Parent"
}
$Child = [PSCustomObject]@{
    Name = "Child"
}
$Parent | Add-Member Child $Child
$Child | Add-Member Parent $Parent

Это означает, что я ожидаю, что $Parent (, $Child.Parent) и $Parent.Child.Parent ссылаются на один и тот же объект.

Но проблема в том, что и $Parent.GetHashCode(), и $Child.GetHashCode() уже возвращают одно и то же Hashcode ... даже они полностью отличаются друг от друга.

Очевидно, что, как предлагается в описании Как: проверить равенство эталонов (идентичность) (Руководство по программированию в C #) , правильный способ проверить, имеют ли два объекта одинаковую ссылку, - это использовать Object.ReferenceEquals метод:

[object]::ReferenceEquals($Parent, $Child)
False

Не только я хотел бы исправить это в моем ConvertTo-Expression командлете, но я также хотел бы лучше понять это.
Почему метод .GetHashCode() возвращает один и тот же хеш-код для разных объектов PSCustomObject?
Как я могу создать индексный список (уникальных) ссылок на объекты?
Или это просто невозможно, и я должен просто проиндексировать все не [ValueType] свойства объектов и проверить весь список на [Object.ReferenceEquals], какая текущая итерация свойства объекта?

...