Вопрос

Это учебный проект.У меня есть три класса баз данных 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.Это код класса A:

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

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

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

Спасибо.

Это было полезно?

Решение

Метод Invoke принимает объекты) что вам нужно передать в конструктор.Вы проходите мимо тип БДСоединение.Вам следует передать экземпляр 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top