代码之家  ›  专栏  ›  技术社区  ›  Gishu

为什么可以在Office Interop中创建接口实例?

  •  1
  • Gishu  · 技术社区  · 16 年前

    我在使用Office Interop类时见过很多次这种情况

    this.CustomXMLParts.Add(MyResources.Data, new Office.CustomXMLSchemaCollection());
    

    如果我将鼠标悬停在CustomXMLSchemaCollection类上,它将显示为一个接口。那我怎么能做一个新的呢?给出了什么? 顺便说一句,这段代码可以编译并运行。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Jorge Ferreira    16 年前

    您没有创建 CustomXMLSchemaCollection 接口,但是 CustomXMLSchemaCollectionClass 共类。

    的定义 自定义XmlSchemaCollection 接口是:

    [Guid("000CDB02-0000-0000-C000-000000000046")]
    [CoClass(typeof(CustomXMLSchemaCollectionClass))]
    public interface CustomXMLSchemaCollection : _CustomXMLSchemaCollection
    {
    }
    

    这意味着实现接口的指定coclass是 自定义XmlSchemaCollectionClass . 我的猜测是,当C编译器看到 自定义XmlSchemaCollection 它将其转换为创建 自定义XmlSchemaCollectionClass 基于接口提供的属性。

    写下这个简单的例子后:

    namespace ConsoleApplication2
    {
        using System;
        using Office = Microsoft.Office.Core;
    
        class Program
        {
            static void Main(string[] args)
            {
                Office.CustomXMLSchemaCollection test = new Office.CustomXMLSchemaCollection();
            }
        }
    }
    

    我只是跑 ildasm 并获得以下msil:

    .method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // Code size       8 (0x8)
      .maxstack  1
      .locals init ([0] class [Interop.Microsoft.Office.Core]Microsoft.Office.Core.CustomXMLSchemaCollection test)
      IL_0000:  nop
      IL_0001:  newobj     instance void [Interop.Microsoft.Office.Core]Microsoft.Office.Core.CustomXMLSchemaCollectionClass::.ctor()
      IL_0006:  stloc.0
      IL_0007:  ret
    } // end of method Program::Main
    

    如您所见,构造的类是 自定义XmlSchemaCollectionClass 以证明我的初步假设。