作为我的Powershell脚本的一部分,我需要实质上实现广度优先搜索。所以,我需要队列和计算System.Collections.Queue是一样好任何其他队列。但是,当我将对象从队列中取出时,Powershell会失去跟踪已添加到对象中的任何属性。在通过System.Collections.Queue传递对象时丢失类型信息
这是怎么回事?我如何访问我的财产?
此示例说明问题:
$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
之前添加属性。所以,我需要创建一个PSObject
或将出队结果投给PSObject
。
我还是不明白这里发生的一切。 add-member
是否修改$object
来参考它创建的PSObject
?如果不是的话,Powershell运行时如何知道$object
实际上是PSObject
? $object.gettype().name
是Object
而不是PSCustomObject
。
添加成员只能直接修改PSObjects,因为那些可以有类型扩展的成员。要修改常规对象,请使用-PassThru并获取新对象。 '$ Object = Add-Member -input $ Object ... -PassThru'。这实际上会创建一个PSObject来包装常规对象。新的PSObject对你来说基本上是透明的。 – JasonMArcher 2011-06-18 17:38:18