2017-07-13 2 views
2

J'ai une variable xml que je reçois de Invoke-restmethod. Appelons il $object1Powershell: sauvegarde des changements de xml dans une nouvelle variable xml ou un nouvel objet, en gardant l'objet original inchangé

Je veux faire une nouvelle variable ou un objet $object2 qui est la même chose que $object1 mais avec quelques modifications aux valeurs

Voici ce que j'ai essayé:

$object2 = $object1 

$object2.sweets.candy.Where({$_.lemondrop -gt 1}) | Foreach{$_.gumdrop = 20} 

Maintenant, le problème avec c'est quand je double vérifier $object1 la valeur est changée là aussi ... Je ne veux pas que

Je veux juste que la chage reste dans $object2

Qu'est-ce que je fais mal ici?

Répondre

2

Vous devez clone$object1 afin d'obtenir une copie indépendante de celui-ci:

$object2 = $object1.Clone() 

[System.Xml.XmlDocument] est un type de référence (par opposition à un type de valeur tels que [int]), qui signifie que:

$object2 = $object1 

simplement fait $object2 pointez sur le même objet que $object1.
Vous pouvez vérifier cela comme suit:

[object]::ReferenceEquals($object1, $object2) 

En général:

  • = avec un type valeur exemple copie la valeur réelle , à savoir, des clones implicitement.
  • = avec la référence à l'instance des copies de type d'instance de référence , à savoir, il crée une autre référence à la même instance.

Pour déterminer si un type donné est un type de valeur ou d'un type de référence, utilisez booléenne .IsValue propriété du type:

# Inspect a type directly. 
> [System.Xml.XmlDocument].IsValueType 
False # -> a *reference* type 

# Inspect a type via an instance thereof: 
> $xml = [xml] '<xml/>'; $xml.GetType().IsValueType 
False 
+0

@ A.Zia: Je suis heureux de l'entendre aidé; mon plaisir. – mklement0