1

これは研究プロジェクトです。3つのデータベースクラスA、B、Cがあります。作成するクラスのオブジェクトをコンストラクターを介して受け取るファクトリクラスがあります。3つのクラス[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'はどのようにしてここに到達しましたか?DBconnection型の変数を受け取るコンストラクターを持つクラスAのオブジェクトを作成しようとしています。

現在、クラスAのインスタンスのみを作成するためにファクトリクラスの命令を渡しています。これはクラスAのコードです。

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

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

私は何が間違っているのですか?

ありがとう。

4

1 に答える 1

3

Invokeメソッドは、コンストラクターに渡す必要のあるオブジェクトを受け取ります。タイプDbConnectionを渡します。渡す必要があるのは、DbConnectionのインスタンスです。

もう少し明確にするために、これらのオブジェクトの1つを直接作成している場合は、次のようにします。

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.
于 2009-05-01T18:46:29.577 に答える