2010-03-20 14 views
5

sto lavorando con MS Excel interoperabilità in C# e non capisco come questa particolare linea di codice funziona:Creazione istanza di interfaccia in C#

var excel = new Microsoft.Office.Interop.Excel.Application(); 

dove Microsoft.Office.Interop.Excel.Application è un'interfaccia definita come:

[Guid("000208D5-0000-0000-C000-000000000046")] 
[CoClass(typeof(ApplicationClass))] 
public interface Application : _Application, AppEvents_Event 
{ 
} 

sto pensando che un po 'di magia accade quando l'interfaccia è decorato con un attributo CoClass, ma ancora come è possibile che siamo in grado di creare un'istanza di un'interfaccia con una nuova parola chiave ? Non dovrebbe generare un errore di compilazione?

risposta

3

In realtà il codice che hai citato ha creato l'istanza della classe ApplicationClass e questo è l'attributo CoClass.

Vedere questa risposta per i dettagli: How does the C# compiler detect COM types?

+0

+1 ero d'accordo con questo. – amelvin

4

Ayende blogged su questo.

+0

+1 Blog interessante, ma potrei non aver fretta di usarlo. Sembra un patter adattatore applicato a un'interfaccia (se questo ha senso!). – amelvin

1

ApplicationClass è implementare l'interfaccia dell'applicazione. In due parole, l'interfaccia è la dichiarazione dei metodi di classe. La tua linea di codice crea un'istanza della classe ApplicationClass (poiché l'interfaccia ha attributo con la classe con costruttore), richiede questa istanza di interfaccia Application e la mette in Excel excel.

Sulla seconda domanda: no, non è possibile creare un'interfaccia con la parola chiave 'nuova'. Perché ogni interfaccia ha solo la dichiarazione dei metodi, non l'implementazione. Si può provare questo per creare il proprietario di classi e interfacce:

interface MyIntf { 
    void method1(string s1); 
} 

public class MyIntfImplementation : MyIntf { 

    void method1(string s1) { 
    // do it something 
    } 
} 

Dopo questo si può usare questo:

MyIntf q = new MyIntfImplementation(); 
q.method1();