为什么这个 docx 处理代码不是 work/compile?

Why does this docx-processing code not work/compile?

我有这段代码,它处理一个 Word docx 文件:

void bookmarkReplace(BookmarkStart bms, Dictionary<string, string> values )
{
    foreach( var key in values)
    {
        string bookmarkName = bms.Name;
        if (bms.Name.Equals( key.Key))
        {

            bms.InsertBeforeSelf<BookmarkStart>(new Run(new Text(key.Value)));
            bms.Remove();
            break;
        }
    }
}

它甚至不编译。 InsertBeforeSelf报错:"has some invalid arguments",因为在BookmarkStart之前不能插入除BookmarkStart以外的其他类型。诡异的。为什么会这样? 我的 Word docx 文件在 BookmarkStart 元素之前显示 <w:pRr> 元素:

<w:p w14:paraId="49842CE1" w14:textId="1248047E" w:rsidR="000C7F1A" w:rsidRDefault="000C7F1A" w:rsidP="00BB4EA3">
    <w:pPr>
       <w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
       <w:jc w:val="right"/>
       <w:rPr>
          <w:lang w:val="en-US"/>
       </w:rPr>
    </w:pPr>
    <w:bookmarkStart w:id="17" w:name="FlexLV"/>
    <w:bookmarkEnd w:id="17"/>
</w:p>

关于如何解决将 BookmarkStart 替换为文本 run 的问题,有什么建议吗? 顺便说一句:在程序的后面,我删除了所有 BookmarkStartBookmarkEnd 元素。

InsertBeforeSelf 是泛型,泛型类型 T 是您要插入的 新元素 的类型, 不是 你之前插入的元素的类型。这一行:

bms.InsertBeforeSelf<BookmarkStart>(new Run(new Text(key.Value)));

是说你想在bms之前插入一个BookmarkStart,而你想插入的BookmarkStart是一个new Run。显然 Run 不是 BookmarkStart 所以你会得到一个编译错误:

cannot convert from 'DocumentFormat.OpenXml.Wordprocessing.Run' to 'DocumentFormat.OpenXml.Wordprocessing.BookmarkStart'

修复很简单,您需要将通用类型定义为 Run,因为这就是您实际插入的内容:

bms.InsertBeforeSelf<Run>(new Run(new Text(key.Value)));

更简单,你可以完全放弃类型,让编译器从参数中推断出来:

bms.InsertBeforeSelf(new Run(new Text(key.Value))); //the compiler infers that T is a Run