Pergunta

Este é um projecto de estudo. I têm três classes de bases de dados A, B, C. Há uma classe de fábrica que recebe através de seu construtor qual objeto de classe para criar. Cada uma das três classes [A, B, C] tem um construtor com um parâmetro para fornecer o objecto de ligação da base de dados. Este é o código que estou usando no método createObject da classe 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;

A última linha acima dá esse erro.

" Objeto do tipo 'System.RuntimeType' não pode ser convertido para o tipo 'System.Data.Common.DbConnection'. "

Como o 'System.RuntimeType' chegar aqui? Eu estou tentando criar um objeto da classe A, que tem um construtor que leva uma variável do tipo DbConnection.

Atualmente eu estou passando as instruções de classe de fábrica para criar uma instância de única classe A. Este o código de classe A:

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

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

O que estou fazendo de errado?

Graças.

Foi útil?

Solução

O método Invoke leva os objeto (s) que você precisa passar para o construtor. Você está passando o tipo DbConnection. O que você deve estar passando, é uma instância de DbConnection.

Para ser um pouco mais claro, se você estivesse criando diretamente um desses objetos, você faria algo assim:

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

O que você está fazendo, porém, é o mesmo que fazer o seguinte:

Type type = typeof(DbConnection);
SqlServerDB db = new SqlServerDB(type); //This is obviously wrong.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top