Pregunta

Este es un proyecto de estudio. Tengo tres clases de base de datos A, B, C. Hay una clase de fábrica que recibe a través de su constructor qué objeto de clase crear. Cada una de las tres clases [A, B, C] tiene un constructor con un parámetro para suministrar el objeto de conexión a la base de datos. Este es el código que estoy usando en el método createObject de la clase de fábrica:

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;

La última línea anterior da este error.

" El objeto del tipo 'System.RuntimeType' no se puede convertir al tipo 'System.Data.Common.DbConnection'. "

¿Cómo llegó el 'System.RuntimeType' aquí? Estoy intentando crear un objeto de clase A que tiene un constructor que toma una variable de tipo DBconnection.

Actualmente estoy pasando a las instrucciones de clase de fábrica para crear una instancia de clase A solamente. Este es el código de la clase A:

public class SqlServerDB: Database
{
    string str = "";

    public SqlServerDB(DbConnection DBConn)
        : base(DBConn)
    {
        str = "SQLServer";
    }
}

¿Qué estoy haciendo mal?

Gracias.

¿Fue útil?

Solución

El método Invoke toma el objeto (s) que debe pasar al constructor. Estás pasando el tipo DbConnection. Lo que deberías pasar es una instancia de DbConnection.

Para ser un poco más claro, si estuvieras creando directamente uno de estos objetos, harías algo como esto:

DbConnection connection = GetConnection(); //some method that gives you back a connection object
SqlServerDB db = new SqlServerDB(connection);

Sin embargo, lo que estás haciendo es lo mismo que hacer esto:

Type type = typeof(DbConnection);
SqlServerDB db = new SqlServerDB(type); //This is obviously wrong.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top