1

我想继承DocX,集成 Word 文档的 InterOp 打印:

public class WordDoc : DocX {
    static private Microsoft.Office.Interop.Word.Application wordApp;

    static WordDoc() {
    }
}

但是当我尝试这样做时,我收到了这个错误:

'DocX' 不包含采用 0 个参数的构造函数

从元数据中我可以看到根本没有定义构造函数,所以我认为应该生成空构造函数。我也没有为我的基类提供构造函数。

我确实有静态构造函数,但是当我删除它时,我仍然得到同样的错误。

4

2 回答 2

1

您尝试继承的类有一个内部构造函数:

internal DocX(DocX document, XElement xml)
  : base(document, xml)
{
}

所以你不能从这个类继承。如果省略默认构造函数,编译器将生成:

public WordDoc() : base() {

}

但是base()构造函数不可访问(内部)。如果您创建默认构造函数:

public WordDoc() {

}

编译器仍会添加对 的调用base(),因为您不能从类继承并且以某种方式忽略调用任何此基类构造函数。

因此,不要继承 - 使用其他方式,如扩展方法、代理类等,具体取决于您要解决的具体问题。

于 2017-04-11T14:56:55.893 回答
1

如果您查看源代码,您会看到确实声明了一个构造函数:

internal DocX(DocX document, XElement xml)
        : base(document, xml)
{
}

也就是说,考虑到它是被标记internal的,看起来这个类并不打算成为公共 API,因此,你不应该尝试直接实例化它或从它继承。

相反,所有示例似乎都依赖于Create该类中的静态方法:

public static DocX Create(string filename, 
    DocumentTypes documentType = DocumentTypes.Document)
{
    // Store this document in memory
    MemoryStream ms = new MemoryStream();

    // Create the docx package
    //WordprocessingDocument wdDoc = WordprocessingDocument.Create(ms, 
        DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
    Package package = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);

    PostCreation(package, documentType);
    DocX document = DocX.Load(ms);
    document.filename = filename;
    return document;
}
于 2017-04-11T14:57:05.323 回答