1

次のようなオブジェクトをインスタンス化するコードがあります

ObjectHandle instance = Activator.CreateInstance(assembly, cls);
return (T)instance.Unwrap();

現在、ほとんどの場合、 で表される型にclsはコンストラクターがなく、簡単に作成できます。しかし、パラメーターを取るコンストラクターを持つクラスが 1 つあります。これで上記のコードを呼び出すと、次のエラーが発生します

Constructor on type 'X' not found

パラメータはインターフェイスであり、特定の具体的なインスタンスを返すように Autofac を構成しました。私の質問は、上記のコードを変更してこのコンストラクターを「見つけ」、パラメーターの具体的なインスタンスを返すように Autofac を取得し、オブジェクトをインスタンス化すると同時に、コンストラクターのない他のものを許可する、クリーンでナイスな方法は何ですか?クラスはインスタンス化されますか?

4

1 に答える 1

2

コードでコンストラクターを定義するとすぐに、コンパイラーはデフォルトのパラメーターなしのコンストラクターを生成しなくなります。これは通常、Lazy<T>またはあなたのケースでは:を使用していない限り、それほど大きな問題ではありません。Activator.CreateInstanceこれは、常にデフォルトのパラメーターなしのコンストラクターを使用します。

このメソッドに渡されるクラスにパラメーターなしのコンストラクターを強制する「最もクリーンな」方法は、メソッドへのnew()制約を使用することです。

public T SomeMethod<T>(Assembly asm, T type) where T : new()

これにより、この関数を呼び出すものはすべてパラメーターなしのコンストラクターを持つ必要があり、そうでない場合はコンパイルされないことがコンパイラーに通知されます。

やや汚い方法は、現在問題を引き起こしている型でパラメーターなしのコンストラクターを宣言することですが、それは応急処置です。実際に問題を解決しているわけではありません。

注: メソッドで他の種類の制約を使用している場合、そのnew()制約は常に最後のものでなければなりません。

于 2013-07-20T23:10:18.553 に答える