Ошибка GetConstructor.invoke - PullRequest
1 голос
/ 01 мая 2009

Это учебный проект. У меня есть три класса базы данных A, B, C. Существует класс фабрики, который получает через свой конструктор объект класса, который нужно создать. Каждый из трех классов [A, B, C] имеет конструктор с параметром для предоставления объекта подключения к базе данных. Вот код, который я использую в методе createObject класса фабрики:

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;

Последняя строка выше выдает эту ошибку.

" Объект типа 'System.RuntimeType' не может быть преобразован в тип 'System.Data.Common.DbConnection'. "

Как появился System.RuntimeType? Я пытаюсь создать объект класса A, у которого есть конструктор, который принимает переменную типа DBconnection.

В настоящее время я перехожу к инструкциям фабричного класса, чтобы создать только экземпляр класса А. Это код класса A:

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

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

Что я делаю не так?

Спасибо.

1 Ответ

3 голосов
/ 01 мая 2009

Метод Invoke принимает объект (ы) , который необходимо передать в конструктор. Вы передаете в типе DbConnection. То, что вы должны передать, это экземпляр DbConnection.

Чтобы быть более понятным, если бы вы непосредственно создавали один из этих объектов, вы бы сделали что-то вроде этого:

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

То, что вы делаете, это то же самое, что и вы:

Type type = typeof(DbConnection);
SqlServerDB db = new SqlServerDB(type); //This is obviously wrong.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...