Errore GetConstructor.invoke
-
03-07-2019 - |
Domanda
Questo è un progetto di studio. Ho tre classi di database A, B, C. Esiste una classe factory che riceve attraverso il suo costruttore quale oggetto della classe creare. Ognuna delle tre classi [A, B, C] ha un costruttore con un parametro per fornire l'oggetto di connessione al database. Questo è il codice che sto usando nel metodo createObject della classe factory:
Type classtyp = Type.GetType(className);
Type[] constrParam = new Type[1];
constrParam[0] = typeof(DBConnection);
ConstructorInfo constr = database.GetConstructor(constrParam);
return constr.Invoke(constrParam) as Database;
L'ultima riga sopra riporta questo errore.
" L'oggetto del tipo 'System.RuntimeType' non può essere convertito nel tipo 'System.Data.Common.DbConnection'. "
Come è arrivato il 'System.RuntimeType'? Sto cercando di creare un oggetto di classe A che ha un costruttore che accetta una variabile di tipo DBconnection.
Attualmente sto passando alle istruzioni della classe di fabbrica per creare solo un'istanza di classe A. Questo è il codice di classe A:
public class SqlServerDB: Database
{
string str = "";
public SqlServerDB(DbConnection DBConn)
: base(DBConn)
{
str = "SQLServer";
}
}
Cosa sto facendo di sbagliato?
Grazie.
Soluzione
Il metodo Invoke prende gli oggetti che devi passare al costruttore. Stai passando nel tipo DbConnection. Quello che dovresti passare è un'istanza di DbConnection.
Per essere un po 'più chiari, se stessi creando direttamente uno di questi oggetti, faresti qualcosa del genere:
DbConnection connection = GetConnection(); //some method that gives you back a connection object
SqlServerDB db = new SqlServerDB(connection);
Quello che stai facendo è lo stesso di farlo:
Type type = typeof(DbConnection);
SqlServerDB db = new SqlServerDB(type); //This is obviously wrong.