Logo UGIdotNET

Interoperabilità late bound mediante Reflection

Una caratteristica molto apprezzata di Visual Basic ("Classic", ma anche .NET se usate -speriamo di no- la direttiva di compilazione "Strict Off") è la facilità con la quale si possono implementare accessi late-bound ai membri di un oggetto. In pratica, qualcosa del genere (usando la sintassi VB6):

Dim cn
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString= "" 'Metti qui unaconnection string valida
cn.Open
cn.Close
Set cn = Nothing

Come fare tutto ciò in C# (o VB .NET "strict")? Innanzitutto, distinguiamo 2 "problemi":
  1. Ottenere la istanza di una classe COM conoscendone il ProgID
  2. Accedere in late binding ai membri esposti dall'oggetto
Possiamo risolvere il primo utilizzando il metodo statico GetTypeFromProgID esposto dalla classe Type, e il secondo utilizzando le funzionalità di Reflection offerte dal Framework .NET in questo modo (ricordando di referenziare il namespace System.Reflection):

string connectionString = ""; //Metti qui una stringa di connessione valida
Type theType = Type.GetTypeFromProgID("ADODB.Connection");
object cn = Activator.CreateInstance(theType);
theType.InvokeMember("ConnectionString", BindingFlags.SetProperty, null, cn, new object[]{connectionString});
theType.InvokeMember("Open", BindingFlags.InvokeMethod, null, cn, null);
theType.InvokeMember("Close", BindingFlags.InvokeMethod, null, cn, null);
cn=null;

Autore: Andrea Saltarello
Data: 22 marzo 2004
Ultimo aggiornamento: 23 luglio 2004
Categorie:  Varie

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185