Ini mungkin tidak mungkin, tetapi saya memiliki kelas ini:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Masih ada lagi, tapi mari kita tetap sederhana. Tipe generik (DataType) terbatas pada tipe nilai dengan pernyataan where. Yang ingin saya lakukan adalah memiliki daftar objek Metadata ini dari berbagai jenis (Tipe Data). Seperti:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
Apakah ini mungkin?
Baik kelas dasar abstrak dan antarmuka menyediakan tingkat kontrol dengan membatasi jenis elemen yang dapat ditambahkan ke daftar. Saya juga tidak bisa melihat bagaimana tinju masuk ke ini.
—
0b101010
Tentu saja, jika Anda menggunakan .NET v4.0 atau lebih tinggi maka kovarians adalah solusinya.
—
0b101010
List<Metadata<object>>
lakukan triknya.
@ 0b101010, Keduanya hanya membatasi tipe referensi, semua tipe nilai bawaan dan struct apa pun masih dapat ditambahkan. Selain itu, pada akhirnya, Anda memiliki daftar
—
Saeb Amini
MetaData
jenis referensi alih-alih jenis nilai asli Anda tanpa informasi (waktu kompilasi) tentang jenis nilai yang mendasari setiap elemen, yang secara efektif "tinju".
List<object>
? Mereka tidak akan berhenti boxing / unboxing, mereka tidak akan menghilangkan kebutuhan untuk casting, dan pada akhirnya, Anda mendapatkanMetadata
objek yang tidak memberi tahu Anda apa-apa tentang yang sebenarnyaDataType
, saya sedang mencari solusi untuk mengatasi masalah tersebut. Jika Anda akan mendeklarasikan antarmuka / kelas, hanya demi bisa memasukkan tipe generik implement / turunan dalam daftar generik, seberapa jauh perbedaannya daripada menggunakan yangList<object>
lain selain memiliki lapisan yang tidak berarti?