Как часть моего скрипта Powershell, мне нужно, по сути, реализовать поиск в ширину. Итак, мне нужна очередь и понял, что System.Collections.Queue так же хорош, как и любая другая очередь. Однако, когда я получаю объект из очереди, Powershell теряет все свойства, которые я добавил к объекту.
Что здесь происходит? Как мне получить доступ к моей собственности?
Этот пример демонстрирует проблему:
$object = new-object object
add-member -membertype noteproperty -name AnInteger -value 2 -inputobject $object
$queue = new-object system.collections.queue
$queue.enqueue($object)
$dequeued = $queue.dequeue()
# 1. True - both variables refer to the same object.
$object -eq $dequeued
# 2. True - using the original variable, can access the property.
$object.AnInteger -ne $null
# 3. False. Err, What?
$dequeued.AnInteger -ne $null
Решение и дополнительные вопросы
Я нашел свою ошибку: add-member
изменяет экземпляр PSObject
, а не Object. Похоже, он был создан, чтобы обернуть $object
перед добавлением свойства. Итак, мне нужно было либо создать PSObject
, либо привести результат удаления в PSObject
.
Я до сих пор не понимаю всего, что здесь происходит. add-member
изменил $object
для ссылки на PSObject
, который он создал? Если нет, то как во время выполнения Powershell узнал, что $object
на самом деле PSObject
? $object.gettype().name
это Object
не PSCustomObject
.