コンストラクターにパラメーターが必要なジェネリック型のインスタンスを作成しますか? 質問する

コンストラクターにパラメーターが必要なジェネリック型のインスタンスを作成しますか? 質問する

BaseFruitに を受け入れるコンストラクターがある場合int weight、このようなジェネリック メソッドで果物をインスタンス化できますか?

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

コメントの後ろに例が追加されています。パラメータなしのコンストラクタを指定して、すべてをメンバー変数で埋める場合にのみ、これが実行できるようですBaseFruit。実際のコード (果物に関するものではありません) では、これはあまり実用的ではありません。

ベストアンサー1

さらに簡単な例:

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

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

特定のコンストラクターが存在することを確認する必要がありますが、この種の要件はコードの臭いになる可能性があります (または、現在のバージョンの C# では回避するように努めるべきものです)。

おすすめ記事