Этот вопрос относится к ранее заданному вопросу: Можно ли ссылаться на другое свойство в конструкторе?
Для моего 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]
, какая текущая итерация свойства объекта?