如何识别和索引对象引用

时间:2019-01-06 15:59:14

标签: powershell object indexing reference

此问题与先前提出的问题有关:Is it possible to reference another property in a constructor?

对于我的ConvertTo-Expression,我想跟踪对象引用,以便可以检查属性对象是否已被序列化。为此,我正在创建一个哈希表,该哈希表使用对象的.GetHashCode()方法(非[ValueType]对象的方法)作为Key
这适用于安静一些对象,但不适用于PSCustomObjects

作为一个例子,我想确定Parent属性的Child属性引用了相同的$Parent对象:

$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 ...即使它们彼此完全不同。

很显然,如How to: Test for Reference Equality (Identity) (C# Programming Guide)的描述所建议,检查两个对象是否具有相同引用的正确方法是使用Object.ReferenceEquals方法:

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

我不仅想在我的ConvertTo-Expression cmdlet中修复此问题,还希望更好地理解这一点。
为什么.GetHashCode()方法为不同的PSCustomObjects返回相同的哈希码?
如何创建(唯一)对象引用的索引列表?
或者,这根本不可能吗?我应该只索引 all 个非[ValueType]对象的属性,并检查整个列表中[Object.ReferenceEquals]当前对象属性是哪个迭代的吗?

0 个答案:

没有答案