Ошибка GetConstructor.invoke
-
03-07-2019 - |
Вопрос
Это учебный проект.У меня есть три класса баз данных 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.