Senarai dalam C# menyimpan berbilang jenis generik
Jenis generik dalam C# menyediakan mekanisme yang berkuasa untuk mencipta kelas dan kaedah yang boleh beroperasi pada pelbagai jenis data. Walau bagaimanapun, masalah biasa sering timbul apabila cuba menggunakan berbilang jenis generik dalam senarai.
Pertimbangkan contoh berikut:
<code class="language-csharp">public class Metadata<DataType> where DataType : struct { private DataType mDataType; } List<Metadata<DataType>> metadataObjects; //错误: DataType 未定义 metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
Matlamat di sini ialah untuk membuat senarai yang mengandungi objek Metadata daripada jenis data yang berbeza. Walau bagaimanapun, kekangan Metadata<DataType>
pada kelas where
mengehadkan jenis generik DataType
kepada jenis nilai. Ini bermakna metadataObjects
bahawa setiap item dalam senarai mestilah daripada jenis generik yang sama, jadi anda tidak boleh menambah objek daripada jenis yang berbeza.
Untuk mengatasi had ini, satu cara adalah dengan memperkenalkan kelas asas abstrak untuk Metadata
seperti berikut:
<code class="language-csharp">public abstract class Metadata { } // 继承抽象 Metadata 类 public class Metadata<DataType> : Metadata where DataType : struct { private DataType mDataType; }</code>
Dengan mencipta kelas asas abstrak Metadata
, kelas generik Metadata<DataType>
kini boleh melanjutkan kelas asas ini. Ini membolehkan kami mempunyai senarai Metadata
objek di mana setiap item boleh menjadi jenis generik yang berbeza.
Kod yang diubah suai adalah seperti berikut:
<code class="language-csharp">List<Metadata> metadataObjects = new List<Metadata>(); metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
Kini metadataObjects
senarai boleh menyimpan objek daripada jenis nilai yang berbeza, dengan berkesan mencapai matlamat untuk mempunyai berbilang jenis generik dalam senarai. Perlu diingatkan bahawa penukaran jenis diperlukan apabila mengakses atribut mDataType
, kerana kelas asas Metadata
tidak mengetahui DataType
khusus.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyimpan Pelbagai Jenis Generik dalam Senarai Tunggal dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!