Artikel ini meneroka cara membuat instantiate jenis generik dengan pembina berparameter dalam C#.
Andaikan terdapat kaedah generik untuk menambah buah-buahan pada pengurus buah:
<code class="language-csharp">public void AddFruit<T>() where T : BaseFruit { BaseFruit fruit = new T(weight); // 例如:new Apple(150) fruit.Enlist(fruitManager); }</code>
di mana kelas BaseFruit
mempunyai pembina yang mengambil integer weight
sebagai parameter.
Soalan: Bolehkah kita membuat instantiat objek buah dengan berat tertentu dalam kaedah generik ini?
Jawapan: Ya, tetapi tidak secara langsung seperti dalam contoh. Terdapat dua kaedah:
1. Gunakan kelas Activator:
Menggunakan kelas Activator
, kita boleh membuat instantiat objek jenis T
secara dinamik dan lulus parameter yang diperlukan sebagai tatasusunan objek:
<code class="language-csharp">return (T)Activator.CreateInstance(typeof(T), new object[] { weight });</code>
Perhatikan bahawa ini memerlukan kelas BaseFruit
mempunyai pembina tanpa parameter awam untuk diperiksa oleh pengkompil, tetapi sebenarnya ia menggunakan kelas Activator
untuk mencipta contoh.
2. Gunakan parameter generik dengan pembina:
C# mengehadkan penggunaan pembina yang memerlukan parameter untuk membuat contoh jenis generik. Sebagai penyelesaian, anda boleh mencipta parameter generik dengan nama yang sama dengan jenis dan menentukan parameter pembina dalam definisinya:
<code class="language-csharp">public void AddFruit<T>(T fruit) where T : new(int weight) { fruit.Enlist(fruitManager); } // 使用示例: AddFruit(new Apple(150));</code>
Walau bagaimanapun, pendekatan ini secara amnya tidak disyorkan kerana ia boleh membawa kepada bau kod yang berkaitan dengan keperluan pembina dalam jenis generik.
Atas ialah kandungan terperinci Bolehkah Jenis Generik dengan Pembina Berparameter Dimulakan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!