在单独的文件中从 class 返回 XElement

Returning XElement from class in separate file

我是 C# 新手。我在一个单独的文件中创建了一个 class 来处理文本。主要和文本处理 class 都在 TextProcessing 命名空间中。这不是全部class,只是开始:

using System;
using System.Linq;
using System.Xml.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;

namespace TextProcessing
{
    public class Para2XML
    {
        private Paragraph XMLP;

        public Para2XML(string PText)
        {
            var xmlParagraph = XElement.Parse(PText);
            var XMLP = (Paragraph)TransformElementToOpenXml(xmlParagraph);
        }

        public Paragraph PReturn
        {
            get { return XMLP; }
        }

        private static OpenXmlElement TransformElementToOpenXml(XElement element)
        {
            return element.Name.LocalName switch
            {
                "p" => new Paragraph(element.Nodes().Select(TransformNodeToOpenXml)),
                "em" => new Run(new RunProperties(new Italic()), CreateText(element.Value)),
                "b" => new Run(new RunProperties(new Bold()), CreateText(element.Value)),
                _ => throw new ArgumentOutOfRangeException()
            };
        }

回到我的程序,这是我实例化 class:

的地方
foreach (var bkmkStart in wordDoc.MainDocumentPart.RootElement.Descendants<BookmarkStart>())
{
    if (bkmkStart.Name == "ForewordText")
    {
        forewordbkmkParent = bkmkStart.Parent;
        for (var y = 0; y <= ForewordArray.Length - 1; y++)
        {
            Para2XML TextProcessP = new Para2XML(ForewordArray[y]);
            forewordbkmkParent.InsertBeforeSelf(PReturn);
        }
    }
}

PReturn 在 Para2XML class 中是 public,但它在主要 class 中表现得好像超出了范围。在主要 class 中,红色下划线出现在 PReturn 下,并带有消息 "The name 'PReturn' does not exist in the current context"。如果我在主 class 中声明 PReturn,我会得到 "Do not declare visible instance fields." 我很困惑如何将 XElement return 从单独文件中的 class 到程序。

希望有人能指出我的错误。谢谢!

你必须写TextProcessP.PReturn。即,对象的名称后跟一个点和 属性.

的名称
forewordbkmkParent.InsertBeforeSelf(TextProcessP.PReturn);

局部变量和方法参数的名称通常使用camleCase。 Class级变量,也就是字段,用下划线+驼峰式书写,即_camelCase。所有其他标识符都写在 PascalCase 中(属性、类 名称空间等)。

您不需要重复类型名称两次。写入 var variableName = new TypeName();

我更喜欢使用复数来表示集合。而不是将集合类型附加到名称。即,forewords 而不是 forewordArray。无论如何,将鼠标悬停在名称上方会在工具提示中显示类型。

var processor = new Para2XML(forewords[y]);
forewordbkmkParent.InsertBeforeSelf(processor.PReturn);