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?
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?List<Metadata<object>>
lakukan triknya.struct
kendala, OP tidak berfungsi di sini. LihatMetaData
jenis referensi alih-alih jenis nilai asli Anda tanpa informasi (waktu kompilasi) tentang jenis nilai yang mendasari setiap elemen, yang secara efektif "tinju".Jawaban:
sumber
List<object>
? silakan lihat komentar saya yang diposting di bawah pertanyaan OP.Mengikuti jawaban leppie, mengapa tidak membuat
MetaData
antarmuka:sumber
Saya juga menggunakan versi non-generik, menggunakan
new
kata kunci:Implementasi antarmuka eksplisit digunakan untuk memungkinkan kedua
Data
anggota:Anda bisa mendapatkan tipe nilai penargetan versi:
Ini dapat diperluas ke segala jenis kendala umum.
sumber
DataType
danobject Data
banyak membantu)Deserialize<metadata.DataType>(metadata.Data);
. Ini memberitahu saya tidak dapat menyelesaikan simbol metadata . Bagaimana cara mengambil DataType untuk menggunakannya untuk metode generik?