此问题与先前提出的问题有关: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]
当前对象属性是哪个迭代的吗?