C:\> ''|Get-Member |? { $_.MemberType -eq 'ParameterizedProperty' }
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Chars ParameterizedProperty char Chars(int index) {get;}
C:\>
这是一个非常奇怪的属性。首先,它是由PowerShell添加的,其次,它包含一个无限递归的属性:
C:\> ''.Chars
IsSettable : False
IsGettable : True
OverloadDefinitions : {char Chars(int index) {get;}}
TypeNameOfValue : System.Char
MemberType : ParameterizedProperty
Value : char Chars(int index) {get;}
Name : Chars
IsInstance : True
C:\> ''.Chars.Value
IsSettable : False
IsGettable : True
OverloadDefinitions : {char Chars(int index) {get;}}
TypeNameOfValue : System.Char
MemberType : ParameterizedProperty
Value : char Chars(int index) {get;}
Name : Chars
IsInstance : True
C:\> ''.Chars.GetHashCode()
56544304
C:\> ''.Chars.Value.GetHashCode()
34626228
C:\> ''.Chars.Value.Value.GetHashCode()
3756075
C:\> ''.Chars.Value.Value.Value.GetHashCode()
49108342
C:\> ''.Chars.Value.Value.Value.Value.GetHashCode()
62340979
C:\> ''.Chars.Value.Value.Value.Value.Value.GetHashCode()
24678148
C:\>
哈希码每次都不同,因此必须动态生成。
为什么要关心它?我想使用 PSGallery 中的 Newtonsoft.Json PowerShell 模块,但在桌面版 PowerShell(5.1)中运行时会出错,而在 Core(7.0.3)中则不会。问题在于,我没有一个最小化的重现案例,输入对象非常大。我收到的错误消息是:
ConvertTo-JsonNewtonsoft : Exception calling "SerializeObject" with "2" argument(s): "Self referencing loop detected for property 'Value' with type 'System.Management.Automation.PSParameterizedProperty'. Path 'environments[4].conditions.name.Chars'."
在PS Core中不存在这样的问题。
有人可以解释一下这个属性是什么,为什么我们需要它以及如何摆脱它吗?
编辑 1
我猜这是Newtonsoft.Json
模块的问题。观察:
[DBG]> [pscustomobject]@{ a = 1} | ConvertTo-Json
{
"a": 1
}
[DBG]> [pscustomobject]@{ a = 1} | ConvertTo-JsonNewtonsoft
{
"CliXml": "<Objs Version=\"1.1.0.1\" xmlns=\"http://schemas.microsoft.com/powershell/2004/04\">\r\n <Obj RefId=\"0\">\r\n <TN RefId=\"0\">\r\n
<T>System.Management.Automation.PSCustomObject</T>\r\n <T>System.Object</T>\r\n </TN>\r\n <ToString>@{a=1}</ToString>\r\n <Obj RefId=\"1\">\r\n <TNRef RefId=\"0\" />\r\n <MS>\r\n <I32 N=\"a\">1</I32>\r\n </MS>\r\n </Obj>\r\n <MS>\r\n <I32 N=\"a\">1</I32>\r\n </MS>\r\n </Obj>\r\n</Objs>"
}
[DBG]>
它无法正确解释PowerShell对象。 这使得它无法使用。
[psobject]
==[pscustomobject]
实例通过System.Runtime.Serialization.ISerializable
序列化自己 - 这并不奇怪,因为PS自定义对象的动态属性在.NET意义上不是属性。您所看到的是PS自定义对象的CLIXML序列化。 - mklement0