OpenXML: 使用 Element.Val 和 Element{ Val = "Val" } 的区别



基本上,这个

pRp.GetFirstChild<ParagraphStyleId>().Val = "Heading1";

而这个

pRp.GetFirstChild<ParagraphStyleId>().Remove();
                    pRp.InsertAt(new ParagraphStyleId() { Val = "Heading1" }, 0);

给了我不同的结果。后者按预期工作。第一个没有。为什么?

我正在尝试做的是将文档的第一段设置为Heading1样式,无论是否存在ParagraphStyleId,或者是否设置了其他样式。

另外,有没有更好的方法可以做到这一点?

谢谢!

若要了解完整方案,需要了解引用类型和值类型之间的差异。只有 C# 7.0 及更高版本支持返回 ref 类型:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/ref-returns

在第一种情况下:

pRp.GetFirstChild<ParagraphStyleId>()

函数 GetFirstChild 需要返回一个引用,以便对 val 属性的修改更改 pRp 对象。请记住,默认行为返回所需对象的浅表副本。因此,您所做的任何更改都将应用于副本,而不是父对象。

在第二种情况下:

pRp.GetFirstChild<ParagraphStyleId>().Remove();

这条线直接在父对象上运行,这就是为什么能够删除对象的原因。

pRp.InsertAt(new ParagraphStyleId() { Val = "Heading1" }, 0);

最后,在这里,您将通过将一个新对象附加到父实例中来再次对父实例进行操作。

主要区别在于,在第一种情况下,您是在 ParagraphStyleId 对象的副本上进行操作,而在第二种情况下,您直接在父实例(即 pRp(上进行操作。

最新更新