1. ホーム
  2. c#

[解決済み】コンストラクタがパラメータを必要とするジェネリック型のインスタンスを作成しますか?

2022-04-02 05:12:41

質問

もし BaseFruit を受け入れるコンストラクタがあります。 int weight このような汎用的なメソッドで、果物の一部をインスタンス化することはできますか?

public void AddFruit<T>()where T: BaseFruit{
    BaseFruit fruit = new T(weight); /*new Apple(150);*/
    fruit.Enlist(fruitManager);
}

コメントの後ろに例を追加しています。このようなことは BaseFruit はパラメータなしのコンストラクタで、あとはメンバ変数ですべてを埋めます。私の実際のコードでは(果物についてではない)これはかなり非現実的です。

-更新

では、どうやっても制約で解決することはできないようですね。解答を見ると、3つの解答候補がありますね。

  • ファクトリーパターン
  • リフレクション
  • アクティベータ

リフレクションが一番クリーンでないと思いがちですが、他の2つは決めかねています。

どのように解決するのか?

さらに簡単な例を挙げます。

return (T)Activator.CreateInstance(typeof(T), new object[] { weight });

T に new() 制約を使用するのは、コンパイラがコンパイル時にパブリック パラメータなしコンストラクタをチェックするためだけであり、実際に型を作成するコードは Activator クラスであることに注意してください。

特定のコンストラクタが存在することを自分で確認する必要があり、この種の要件はコードのにおい(というより、現在のバージョンの c# では避けるべきもの)かもしれません。