我有一个函数,它将XDocument对象作为参数。
我需要遍历不同集合中的许多其他对象,并且对于每个对象,在XDocument上执行一些操作。但lopp的每次迭代都需要传递给函数的原始XDocument的原始副本。
但是,如果我只是尝试对传递给函数的变量执行操作,它就像一个指针 - 因此循环的每次迭代都会在最后一次迭代结束时留下的任何状态下接收XDocument。根本没用。
显然我需要复制一份Xdocument,但我看不到直截了当的方式。尝试:
XDocument currentServerXml = XDocumentFromFunction.Document():
然后使用currentServerXml而不是XDocumentFromFunction获取具有相同指针和相同行为的相同副本。
如何为循环的每次迭代创建全新的数据副本?
答案 0 :(得分:17)
您正在寻找带有XDocument的XDocument constructor。这将创建传递的XDocument的深层副本。
示例代码:
var foo_original = XDocument.Load("foo.xml");
var foo_copy1 = new XDocument(foo_original);
var foo_copy2 = new XDocument(foo_original);
答案 1 :(得分:0)
将XDocument保存到流中并从该流中加载另一个实例。
编辑:您可以实现一个扩展方法“CreateCopy()”,它可以封装该解决方案,这样您就可以使用易于使用的解决方案。
答案 2 :(得分:0)
其他响应者建议,流将是最佳选择。但是对于任何不能使用流的人来说,最简单的方法是使用TextReader:
TextReader tr = new StringReader(myXDocument.ToString());
XDocument copyOfMyXDocument = XDocument.Load(tr);
瞧!
答案 3 :(得分:0)
MemberwiseClone
怎么样?
XDocument newdoc = XDocumentFromFunction.Document().MemberwiseClone();