gpt4 book ai didi

arrays - 将 Powershell PSCustomObject 复制到数组元素将传递引用,而不是值

转载 作者:行者123 更新时间:2023-12-02 16:01:37 24 4
gpt4 key购买 nike

不确定我做错了什么,但是在将 Powershell 中的 PSCustomObject 复制到数组元素时,这是通过引用复制的。看这个:

$body = [PSCustomObject]@{ 
albumId = $album_id;
newMediaItems = [PSCustomObject]@()
}

$mediaItem = [PSCustomObject]@{
description = "";
simpleMediaItem = [PSCustomObject]@{
fileName = "";
uploadToken = "";
}
}

$mediaItem.description = "Friend of Mickey Mouse"
$mediaItem.simpleMediaItem.fileName = "Goofy.txt"
$mediaItem.simpleMediaItem.uploadToken = "1111"

$body.newMediaItems += $mediaItem.PsObject.Copy()

$mediaItem.description = "Friend of Rocker Duck"
$mediaItem.simpleMediaItem.fileName = "Donald Duck.txt"
$mediaItem.simpleMediaItem.uploadToken = "2222"

$body.newMediaItems += $mediaItem.PsObject.Copy()


$body | ConvertTo-Json -depth 4

输出:

{
"albumId": null,
"newMediaItems": [
{
"description": "Friend of Mickey Mouse",
"simpleMediaItem": {
"fileName": "Donald Duck.txt",
"uploadToken": "2222"
}
},
{
"description": "Friend of Rocker Duck",
"simpleMediaItem": {
"fileName": "Donald Duck.txt",
"uploadToken": "2222"
}
}
]
}

最佳答案

.psobject.Copy()[pscustomobject] 实例执行(成员方面)克隆。

由于您的 simpleMediaItem 属性包含对 .NET 引用类型 的引用(恰好是另一个 [pscustomobject] 实例),它是复制的 reference,因此原始 [pscustomobject] 和通过 .psobject.Copy() reference 完全相同的对象

对于深度(递归)克隆(没有通用解决方案),您必须创建自定义实现。

您可以使用自定义 class 完全避免该问题定义:

class MediaItem {
[string] $description
[pscustomobject] $simpleMediaItem = [pscustomobject] @{
fileName = ""
uploadToken = ""
}
}

现在,每次需要一个新的独立实例时,您只需使用 [MediaItem]::new()

综合起来:

class MediaItem {
[string] $description
[pscustomobject] $simpleMediaItem = [pscustomobject] @{
fileName = ""
uploadToken = ""
}
}

$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = @()
}

# Create a new instance.
$mediaItem = [MediaItem]::new()
$mediaItem.description = "Friend of Mickey Mouse"
$mediaItem.simpleMediaItem.fileName = "Goofy.txt"
$mediaItem.simpleMediaItem.uploadToken = "1111"

$body.newMediaItems += $mediaItem

# Create a new instance.
$mediaItem = [MediaItem]::new()
$mediaItem.description = "Friend of Rocker Duck"
$mediaItem.simpleMediaItem.fileName = "Donald Duck.txt"
$mediaItem.simpleMediaItem.uploadToken = "2222"

$body.newMediaItems += $mediaItem

$body | ConvertTo-Json -Depth 4

关于arrays - 将 Powershell PSCustomObject 复制到数组元素将传递引用,而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70536872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com