Почему вы можете создать экземпляр интерфейса в Office Interop? - PullRequest
1 голос
/ 22 октября 2008

Я видел это довольно много раз, когда использовал классы Office Interop

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

Если навести указатель мыши на класс CustomXMLSchemaCollection, он отобразится как интерфейс. Тогда почему я могу сделать новое на этом? Что дает? Кстати, этот код компилируется и работает.

1 Ответ

2 голосов
/ 22 октября 2008

Вы создаете не экземпляр интерфейса CustomXMLSchemaCollection, а экземпляр класса CustomXMLSchemaCollectionClass.

Определение для CustomXMLSchemaCollection интерфейса:

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

Это означает, что назначенным классом, который реализует интерфейс, является CustomXMLSchemaCollectionClass. Я предполагаю, что когда компилятор C # видит новый интерфейс для CustomXMLSchemaCollection, он переводит его для создания экземпляра COM CustomXMLSchemaCollectionClass на основе атрибутов, предоставленных интерфейсом.

После написания этого простого примера:

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

Как видите, построенный класс CustomXMLSchemaCollectionClass доказывает мое первоначальное предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...