質問

これは研究プロジェクトです。 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";
    }
}

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

ありがとう。

役に立ちましたか?

解決

Invokeメソッドは、コンストラクターに渡す必要があるオブジェクトを受け取ります。 type 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.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top